#include<stdio.h>
#include<stdlib.h>/*此头文件包含malloc和realloc*/
#define MaxSize 10
typedef struct{
 int *elem;
 int len;
 int listsize;
}Sqlist;
/*初始化动态顺序表*/
void initSqlist(Sqlist *L){
 L->elem=(int *)malloc(MaxSize*sizeof(int));/*创建空间*/
 if(!L->elem) exit(0); /*此时如果L->elem创建空间时错误会返回NULL 故当!NULL时if为真会退出程序*/
 L->len=0; /*表的长度*/
 L->listsize=MaxSize;/*设置表的长度为最大长度*/
}
/*向顺序表中插入元素*/
void insertElem(Sqlist *L,int i,int item)/*item为插入的元素 i为插入的位置*/
{
 int *base,*insertptr,*p;/*定义temp*/
 if(i<1||i>L->len+1) exit(0);/*排断输入的插入位置是否正确*/
 if(L->len>=L->listsize)/*此举应该是为了判断表的最大长度,如果插入数值后表的长度超过最大内存则重新分配内存*/
 {
 base=(int *)realloc(L->elem,(L->listsize+10)*sizeof(int)); /*重新分配内存*/
 L->elem=base;/*将表的内存地址重新分配后赋值,将重新分配的内存的首地址赋给表*/
 L->listsize=L->listsize+100;/*将表的长度增加100*/
 }
 insertptr=&(L->elem[i-1]);/*将插入位置的元素的地址赋值给insertptr*/
 for(p=&(L->elem[L->len-1]);p>=insertptr;p--)/*将元素的地址整个移动*/
 *(p+1)=*p;
 *insertptr=item;/*将item赋值在插入位置的元素*/
 L->len++;/*表的长度增加*/
}
/*从顺序表中删除元素*/
void delElem(Sqlist *L,int i)/*i为要删除所在的位置*/
{
 int *delitem,*q;/*定义temp*/
 if(i<1||i>L->len) exit(0);/*同上判删除位置是否正确*/
 delitem=&(L->elem[i-1]);/*将地址赋给delitem*/
 q=L->elem+L->len-1;/*L->elem指表的首地址+表的长度-1=表的尾地址*/
 for(++delitem;delitem<=q;++delitem)/*每次delitem的地址使用前自增*/
 *(delitem-1)=*delitem;/*将表整体向左移动*/
 L->len--;/*表的长度减少*/
}
/*测试函数*/
main()
{
 Sqlist l;/*声明表l*/
 int i;/*temp*/
 initSqlist(&l);/*定义表l*/
 for(i=0;i<15;i++)/*循环的将1~16数字插入到表l中*/
 insertElem(&l,i+1,i+1);
 printf("\nThis list is:\n");
 for(i=0;i<l.len;i++)/*输出插入后的表*/
 printf("%4d",l.elem[i]);
 delElem(&l,3);/*删除第三个元素*/
 printf("\nDelete the 3 element\n");
 for(i=0;i<l.len;i++)/*输出删除后的表*/
 printf("%4d",l.elem[i]);
 getchar();
}
输出:
This list is:
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Delete the 3 element
 1 2 4 5 6 7 8 9 10 11 12 13 14 15