#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++了。。。