简单的实现静态顺序表:此种简单的顺序表结构并不灵活,因为其无法动态开辟空间。
#include <stdio.h>
#define MaxSize 10
//参数1:传递顺序表的首地址
//参数2:len表的长度
//参数3:插入元素的位置
//参数4:待插入的元素值
int InsertElem(int list[], int *len, int x, int y)
{
if (*len == MaxSize || x < 1 || x > *len + 1)
return 0;
for (int z = *len - 1; z >= x - 1; z--)
list[z + 1] = list[z];
list[x - 1] = y;
*len = *len + 1;
return 1;
}
//参数1:传递顺序表的首地址
//参数2:len表的长度
//参数3:待删除元素的位置
int DeleteElem(int list[], int *len, int x)
{
int y;
if (x < 1 || x >len)
return 0;
for (y = x; y <= *len - 1; y++)
list[y - 1] = list[y];
*len = *len - 1;
return 1;
}
int main()
{
int Sqlist[MaxSize] = {1,2,3,4,5};
int ListLen = 5;
for (int x = 0; x < ListLen; x++)
printf_s("%d ", Sqlist[x]);
printf_s("\n得到当前数组长度:%d\n", MaxSize - ListLen);
InsertElem(Sqlist, &ListLen, 3, 100);
DeleteElem(Sqlist, ListLen, 4);
for (int x = 0; x < ListLen; x++)
printf_s("%d ", Sqlist[x]);
printf_s("\n得到当前数组长度:%d\n", MaxSize - ListLen);
getchar();
return 0;
}
实现动态顺序表,可动态生成数据.
#include <stdio.h>
#define MaxSize 10
typedef int ElemType;
typedef struct{
int *elem;
int length;
int size;
}list;
int InitList(list *mem)
{
mem->elem = (int *)malloc(MaxSize*sizeof(ElemType));
if (!mem->elem)exit(0);
mem->length = 0;
mem->size = MaxSize;
if (mem->elem != 0)
return 1;
}
// 参数1:mem类型的指针基地址
// 参数2:i插入元素的位置
// 参数3:item待插入的元素
void InsertElem(list *mem, int i, ElemType item)
{
ElemType *base, *insertPtr, *p;
if (i<1 || i>mem->length + 1)exit(0);
if (mem->length >= mem->size)
{
// 说明我们的链表满了,需要追加开辟空间
base = (ElemType*)realloc(mem->elem, (mem->size + 10)*sizeof(ElemType));
mem->size = mem->size + 50;
}
insertPtr = &(mem->elem[i - 1]); // 取出第二个元素位置地址
for (p = &(mem->elem[mem->length - 1]); p >= insertPtr; p--)
*(p + 1) = *p;
*insertPtr = item;
mem->length++;
}
// 参数1:mem类型的指针基地址
// 参数2:删除元素的位置
void DeleteElem(list *mem, int i)
{
ElemType *delItem, *p;
if (i<1 || i>mem->length)
exit(0);
delItem = &(mem->elem[i - 1]);
p = mem->elem + mem->length - 1;
for (++delItem; delItem <= p; ++delItem)
*(delItem - 1) = *delItem;
mem->length--;
}
int main()
{
list temp;
InitList(&temp);
for (int x = 1; x < 15; x++)
InsertElem(&temp, x, x ); // 插入1-15
for (int x = 0; x < temp.length; x++) // 打印1-15
printf("%d ", temp.elem[x]);
// 删除第三个位置的数值
DeleteElem(&temp, 3);
// 打印出删除后的结果
for (int x = 0; x < temp.length; x++)
printf("\n%d ", temp.elem[x]);
getchar();
return 0;
}
实现双向链表: