</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define List_init_size 1000
#define Listincrease 1000
typedef int Element;
typedef struct
{
Element *elem;
int length;
int listsize;
}Sqlist;
int Initlist(Sqlist *L)//万年不变的初始化
{
L->elem=(Element *)malloc(List_init_size*sizeof(Element));
if(!L->elem)exit(-1);/*此处也可以是return -1;具体return与exit区别
此处附上几条博客链接:http://blog.csdn.net/xuan_h/article/details/23935471
http://blog.csdn.net/jody1989/article/details/6821477
http://blog.csdn.net/u010046690/article/details/47105665
不喜勿喷
*/
L->length=0;
L->listsize=List_init_size;
return 1;
}
int Createlist(Sqlist *L,int n)//一、为线性表输入元素
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
}
L->length=n;//此处新手易忘
return 1;
}
int Destroylist(Sqlist *L)//二、摧毁顺序表
{
free(L->elem);/*此处亦可以用(*L).elem
具体两者的区别,结构体指针变量可以用->,
而普通结构体变量则用.
*/
L->elem=NULL;//摧毁,简单粗暴
L->length=0;
L->listsize=0;
return 1;
}
int Clearlist(Sqlist *L)//三、只是清空表
{
L->length=0;/*
此时虽说表已经清空,但是原来在表中的元素依然存在
也就是说仍然可以访问原来的那些元素,只是此时访问的话是
非法的,清空之后,键入新元素会覆盖以前的那些数据,
所以并不会影响以后数据的输入,也节省了删除这些数据的时间
*/
return 1;
}
int Emptylist(Sqlist *L)//四、判断表是否非空
{
if(L->length==0)return 1;
else return 0;
}
int Lengthlist(Sqlist *L)
{//五、返回顺序表的长度,个人感觉这个函数并无卵用
return L->length;
}
int Getelem(Sqlist *L,int i,Element *e)
{//六、获取顺序表中位序为i的元素
if(i<1||i>L->length)return -1;//判断i位置是否合法
*e=(L->elem[i-1]);//用e返回也可直接return e;
return 1;
}
/*较为重要的函数,很常用*/
int Deletelist(Sqlist *L,int i,Element *e)
{//七、删除位序为i的元素
//i为要删除元素的位序,注意位序和数组下标的关系
int *p,*q;
if((i<1)||(i>(L->length)))return -1;
p=&(L->elem[i-1]);//要删除的元素
*e=*p;//将其付给e返回
q=L->elem+L->length-1;//指向最后一个元素
for(;p<q;p++)
{
*p=*(p+1);//移位覆盖删除
}
L->length--;//此处易忘
return 1;
}
/*较为重要的函数,插入函数,常用*/
int Insertlist(Sqlist *L,int i,Element e)
{//八、在位置i之前插入新元素e
Element *newbase;//注意其类型
int *p,*q;//注意其类型
if(i<1||i>L->length)return -1;//判断i位置是否合法
if(L->length>=L->listsize)//当内存不足时
{
newbase=(Element *)realloc(L->elem,
(L->listsize+Listincrease)*sizeof(Element));
if(!L->elem)return -1;//莫忘
L->elem=newbase;
L->listsize+=Listincrease;//内存增大
}
q=&(L->elem[i-1]);//取要插入数位置的地址
for(p=&(L->elem[L->length-1]);p>=q;p--)
{
*(p+1)=*p;//往后移位空出要插入的位置
//此处注意对比删除函数中,循环条件与移动方式
}
*q=e;//插入
L->length++;//莫忘长度加一
return 1;
}
int Display(Sqlist *L)
{//九、顺序表输出函数
int i;
for(i=0;i<L->length;i++)
{
printf(i==L->length-1?"%d\n":"%d ",L->elem[i]);
}
return 1;
}
int main()
{
int n;
Sqlist L;
while(1)
{
Element e;
scanf("%d",&n);
Initlist(&L);
Createlist(&L,n);
printf("输出************\n");
Display(&L);
printf("删除之后************\n\n");
Deletelist(&L,3,&e);
Display(&L);
printf("查入之后************\n\n");
Insertlist(&L,3,e);
Display(&L);
printf("取某一元素输出************\n\n");
Getelem(&L,3,&e);
printf("%d\n",e);
printf("清空表之后************\n\n");
Clearlist(&L);
printf("%d\n",L.length);
printf("摧毁表之后************\n\n");
Destroylist(&L);
Display(&L);//此句无效
}
return 0;
}
span()为HTML标签,调试程序时请删除;