题目:用C语言实现数据链表
要求:
1.有基本增添,删除功能。
2.动态内存开辟版本。
程序源码:
头文件
#ifndef __ADD_H__
#define __ADD_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//#define MAX 100
#define DEFAULT_SZ 3 //当前默认有效值
#define ISC_SZ 2 //动态分配默认增长个数
typedef int DataType;
typedef struct SeqList
{
DataType* data;
//DataType data[MAX];
int sz; //当前有效的个数
int capatity; //容量
}SeqList, *pSeqList;
void InitSeqList(pSeqList plist);//初始化顺序表
void PushBack(pSeqList plist, DataType d);//从尾部插入数据
void PopBack(pSeqList plist);//从尾部删除数据
void PushFront(pSeqList plist, DataType d);//从头部插入数据
void PopFront(pSeqList plist);//从头部删除数据
int Find(pSeqList plist, DataType d);//查找指定数
void Remove(pSeqList plist, DataType d);//指定元素删除
void Show(pSeqList plist);//打印顺序表
void BubbleSort(pSeqList plist);//冒泡排序
int BinarySearch(pSeqList plist, DataType d);//非递归实现二分查找
void Insert(pSeqList plist, int pos, DataType d);//指定位置插入
void ReverseList(pSeqList plist);//反向旋转
void DestroySeqList(pSeqList plist);//清空动态顺序表
void CheckSeqList(pSeqList plist);//判断动态顺的序表的空间是否已满,满的话进行扩容
#endif
源文件
#include "标头.h"
void CheckSeqList(pSeqList plist)
{
if (plist->sz == plist->capatity)
{
DataType *tmp = (DataType *)realloc(plist->data, (plist->capatity + ISC_SZ)*sizeof(SeqList));
if (tmp == NULL)
{
perror("realloc");
return;
}
plist->data = tmp;
plist->capatity += ISC_SZ;
}
}
void InitSeqList(pSeqList plist)
{
plist->data = (DataType *)malloc(sizeof(pSeqList)*DEFAULT_SZ);
if (plist->data == NULL)
{
perror("malloc");
return;
}
plist->sz = 0;
plist->capatity = 0;
memset(plist->data, 0, sizeof(pSeqList)*DEFAULT_SZ);
}
void PushBack(pSeqList plist, DataType d)
{
assert(plist);
CheckSeqList(plist);
/*if (plist->sz == MAX)
{
printf("顺序表已满!\n");
return;
}*/
plist->data[plist->sz] = d;
plist->sz++;
}
void PopBack(pSeqList plist)
{
assert(plist);
if (plist->data == NULL)
{
printf("顺序表为空!\n");
return;
}
plist->data[plist->sz - 1] = 0;
plist->sz--;
}
void PushFront(pSeqList plist, DataType d)
{
int i = 0;
assert(plist);
/*if (plist->sz == MAX)
{
printf("顺序表已满!\n");
return;
}*/
CheckSeqList(plist);
for (i = plist->sz; i > 0; i--)
{
plist->data[i] = plist->data[i - 1];
}
plist->data[0] = d;
plist->sz++;
}
void PopFront(pSeqList plist)
{
int i = 0;
assert(plist);
if (plist->data == NULL)
{
printf("顺序表为空!\n");
return;
}
for (i = 0; i < plist->sz - 1; i++)
{
plist->data[i] = plist->data[i + 1];
}
plist->sz--;
}
void Show(pSeqList plist)
{
int i = 0;
assert(plist);
for (i = 0; i < plist->sz; i++)
{
printf("%d ", plist->data[i]);
}
}
int Find(pSeqList plist, DataType d)//查找
{
int i = 0;
assert(plist);
for (i = 0; i < plist->sz; i++)
{
if (plist->data[i] == d)
return i;
}
return -1;
}
void Remove(pSeqList plist, DataType d)
{
int pos = Find(plist, d);
assert(plist);
if (pos != -1)
{
int i = 0;
for (i = pos; i < plist->sz - 1; i++)
{
plist->data[i] = plist->data[i + 1];
}
plist->sz--;
}
}
void BubbleSort(pSeqList plist)
{
int i = 0;
int j = 0;
assert(plist);
for (i = 0; i < plist->sz; i++)
{
for (j = 0; j < plist->sz - i - 1; j++)
{
if (plist->data[j]>plist->data[j + 1])
{
int tmp = plist->data[j];
plist->data[j] = plist->data[j + 1];
plist->data[j + 1] = tmp;
}
}
}
}
int BinarySearch(pSeqList plist, DataType d)
{
int left = 0;
int right = plist->sz - 1;
assert(plist);
while (left <= right)
{
int mid = (left + right) / 2;
if (plist->data[mid] > d)
{
right = mid - 1;
}
else if (plist->data[mid] < d)
{
left = mid + 1;
}
else if (plist->data[mid] == d)
{
return mid;
}
}
return -1;
}
void Insert(pSeqList plist, int pos, DataType d)
{
int i = 0;
assert(plist);
CheckSeqList(plist);
for (i = plist->sz - 1; i>pos; i--)
{
plist->data[i] = plist->data[i - 1];
}
plist->data[pos] = d;
}
void ReverseList(pSeqList plist)
{
assert(plist);
int left = 0;
int right = plist->sz - 1;
while (left < right)
{
int tmp = plist->data[left];
plist->data[left] = plist->data[right];
plist->data[right] = tmp;
left++;
right--;
}
}
void DestroySeqList(pSeqList plist)
{
free(plist->data);
plist->data = NULL;
}
测试文件
#include "标头.h"
void test1()
{
SeqList list;
int tmp = 0;
InitSeqList(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PopBack(&list);
PushFront(&list, 7);
PushFront(&list, 6);
PushFront(&list, 5);
//PopFront(&list);
Remove(&list, 6);
PushBack(&list, 2);
PushFront(&list, 2);
PushBack(&list, 4);
PushFront(&list, 5);
PushBack(&list, 8);
PushFront(&list, 0);
BubbleSort(&list);
Insert(&list, 2, 12);
/*tmp = BinarySearch(&list, 5);
printf("%d\n", tmp);*/
tmp = Find(&list, 6);
printf("%d\n",tmp);
Show(&list);
}
int main()
{
test1();
system("pause");
return 0;
}