#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
厉害,这也就C语言用的是而已了..
是啊。。。
C语言看起来好复杂呀。。。
是啊。。我准备转c++了。。。