线性表的基本操作
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int *elem;
int length;
int listsize;
}SqList;
#define LIST_MAX 10
#define LIST_ADD 2
int InitList(SqList *L)
{
L->elem=(int*)malloc(LIST_MAX*sizeof(int));
if(!L->elem)
{
printf("初始化失败!\n");
exit(-1);
}
L->length=0;
L->listsize=LIST_MAX;
return 1;
}
int DestoryList(SqList *L)
{
free(L->elem);
L->elem=NULL;
return 1;
}
int ClearList(SqList *L)
{
L->length=0;
return 1;
}
int GetList(SqList L,int i,int *e)
{
if(i<0||i>L.length)
{
printf("输出查找的长度超过已有的链表的长度!\n");
exit(-1);
}
*e=*(L.elem+i-1);
return 1;
}
int InsertList(SqList *L,int i,int e)
{
int *newbase,*p,*q;
if(i<0||i>L->length+1)
{
printf("打算插入的位置超出了链表的长度!\n");
exit(-1);
}
if(L->length>=L->listsize)
{
newbase=(int *)realloc(L->elem,(L->listsize+LIST_ADD)*sizeof(int));
if(!newbase)
exit(-1);
L->listsize+=LIST_ADD;
L->elem=L->elem;
}
p=L->elem+i-1;
for(q=L->elem+L->length-1;q>=p;q--)
*(q+1)=*q;
*p=e;
++(L->length);
return 1;
}
int ListEmpty(SqList L)
{
if(L.length==0)
return 1;
else
return 0;
}
int ListLength(SqList L)
{
return L.length;
}
int DeleteList(SqList *L,int i,int *e)
{
int *p;
if(i<0||i>L->length)
{
printf("要删除的元素位置不存在链表中!\n");
exit(-1);
}
p=L->elem+i-1;
*e=*p;
for(;p<L->elem+L->length-1;p++)
*p=*(p+1);
--L->length;
return 1;
}
int LocateElem(SqList L,int e,int (*compare)(int v1,int v2))
{
int *p;
int i=1;
p=L.elem;
while(i<=L.length&&!compare(*(p++),e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
int equal(int v1,int v2)
{
if(v1==v2)
return 1;
else
return 0;
}
int PriorElem(SqList L,int cur_e,int *pre_e)
{
int i;
i=LocateElem(L,cur_e,equal);
if(i>1)
{
*pre_e=*(L.elem+i-2);
return 1;
}
else
{
printf("没有前驱! \n");
exit(-1);
}
}
int NextElem(SqList L,int cur_e,int *next_e)
{
int i=1;
int *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
++i;
++p;
}
if(i==L.length)
return 0;
else
{
*next_e=*(++p);
return 1;
}
}
int ListTraverse(SqList L,int (*visit)(int e))
{
int i=1;
for(i=1;i<=L.length;i++)
visit(*(L.elem+i-1));
return 1;
}
int print(int e)
{
printf("%d ",e);
return 1;
}
int main()
{
int i,e0;
SqList L;
InitList(&L);
for(i=1;i<=11;i++)
InsertList(&L,i,i*2);
printf("链表是否为空:%d(1.表示空,0表示非空)\n",ListEmpty(L));
for(i=1;i<=11;i++)
{
GetList(L,i,&e0);
printf("%d ",e0);
}
printf("\n");
DeleteList(&L,1,&e0);
printf("删除第一个元素%d\n",e0);
printf("该链表的长度为:%d\n",ListLength(L));
printf("查找连表中是否存在4,存在的话,它的位置为%d\n",LocateElem(L,4,equal));
PriorElem(L,8,&e0);
printf("请输出8的前一个元素是:%d\n",e0);
NextElem(L,8,&e0);
printf("请输出8的后一个元素是:%d\n",e0);
ListTraverse(L,print);
printf("\n");
DestoryList(&L);
return 0;
}