顺序表,全名顺序存储结构,是线性表的一种。
顺序表的初始化
Status InitList_Sq(SqList *L)
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
顺序表的插入操作
Status InsertList(SqList *L,int i,ElemType e)
{
ElemType *newbase;
ElemType *q;
ElemType *p;
if(L->length>=LIST_INIT_SIZE)
{
newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
if(i>L->length+1||i<1) return ERROR;
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return OK;
}
顺序表的删除操作
Status DeleteList(SqList *L,int i,ElemType *e)
{
ElemType *p,*q;
if((i>L->length+1)||(i<1)) return ERROR;
if(L->length==0) return ERROR;
p=&(L->elem[i-1]);
*e=*p;
q=&(L->elem[L->length-1]);
for(++p;p<=q;++p)
*(p-1)=*p;
--L->length;
return OK;
}
顺序表的查找
int equal(ElemType e1,ElemType e2)
{
return e1==e2?TRUE:FALSE;
}
int large(ElemType e1,ElemType e2)
{
return e1>e2?TRUE:FALSE;
}
int small(ElemType e1,ElemType e2)
{
return e1<e2?TRUE:FALSE;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType e1,ElemType e2))
{
int i;
ElemType *p;
p=L.elem;
i=1;
while(i<=L.length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return i;
else
return 0;
}
顺序表的销毁
Status DestroyList(SqList *L)
{
if(!L->elem) return ERROR;
free(L->elem);
L->length=0;
L->listsize=0;
return OK;
}
顺序表的基本操作代码
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct SqList
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L)
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
void InputList(SqList *L,int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&L->elem[i]);
L->length=n;
}
void OutputList(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
int ListLength(SqList L)
{
return L.length;
}
Status GetElem(SqList L,int i,ElemType *e)
{
if(i>L.length||i<1) return ERROR;
else
*e=L.elem[i-1];
return OK;
}
Status PriorElem(SqList L,int cur_e,ElemType *pre_e)
{
int i=1,st;
if(cur_e>L.length||cur_e<2) return FALSE;
while(cur_e>=2&&cur_e<=L.length)
{
if(cur_e==L.elem[i-1])
{
st=i-1;
break;
}
++i;
}
*pre_e=L.elem[st-1];
return OK;
}
Status NextElem(SqList L,int cur_e,ElemType *next_e)
{
int i=1,st;
if(cur_e>=L.length) return FALSE;
while(cur_e<L.length)
{
if(cur_e==L.elem[i-1])
{
st=i-1;
break;
}
++i;
}
*next_e=L.elem[st+1];
return OK;
}
int equal(ElemType e1,ElemType e2)
{
return e1==e2?TRUE:FALSE;
}
int large(ElemType e1,ElemType e2)
{
return e1>e2?TRUE:FALSE;
}
int small(ElemType e1,ElemType e2)
{
return e1<e2?TRUE:FALSE;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType e1,ElemType e2))
{
int i;
ElemType *p;
p=L.elem;
i=1;
while(i<=L.length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return i;
else
return 0;
}
Status DeleteList(SqList *L,int i,ElemType *e)
{
ElemType *p,*q;
if((i>L->length+1)||(i<1)) return ERROR;
if(L->length==0) return ERROR;
p=&(L->elem[i-1]);
*e=*p;
q=&(L->elem[L->length-1]);
for(++p;p<=q;++p)
*(p-1)=*p;
--L->length;
return OK;
}
Status InsertList(SqList *L,int i,ElemType e)
{
ElemType *newbase;
ElemType *q;
ElemType *p;
if(L->length>=LIST_INIT_SIZE)
{
newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
if(i>L->length+1||i<1) return ERROR;
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return OK;
}
Status EmptyList(SqList L)
{
return L.length==0?OK:ERROR;
}
void ClearList(SqList *L)
{
L->length=0;
printf("清空线性表成功!\n");
}
Status DestroyList(SqList *L)
{
if(!L->elem) return ERROR;
free(L->elem);
L->length=0;
L->listsize=0;
return OK;
}
void main()
{
SqList L;
ElemType e;
int choice=1,i;
if(InitList_Sq(&L)==OK)
printf("ok\n");
else
printf("error!\n");
while(choice!=0)
{
system("cls");
printf("1.InitList_Sq 2.InputList 3.OutputList \n");
printf("4.GetElem 5.PriorElem 6.NextElem\n");
printf("7.LocateElem 8.DeleteList 9.InsertList\n");
printf("10.EmptyList 11.ClearList 12.DestroyList 0.exit\n");
printf("please input your choice:\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
if(InitList_Sq(&L)==OK)
printf("创建一个表成功!\n");
break;
}
case 2:
{
int num;
printf("请问你要输入几个数:\n");
scanf("%d",&num);
InputList(&L,num);
break;
}
case 3:
{
printf("您输入的数为:\n");
OutputList(L);
printf("顺序表的长度为:%d\n",ListLength(L));
break;
}
case 4:
{
int i;
printf("请输入你要获取第几个位置对应的值:\n");
scanf("%d",&i);
if((GetElem(L,i,&e))==OK)
printf("第%个位置对应的值为:%d\n",i,e);
else if((GetElem(L,i,&e))==ERROR)
printf("没有找到第%d个元素的值\n",i);
break;
}
case 5:
{
int cur_e;
ElemType pre_e;
printf("请输入线性表中的一个元素:\n");
scanf("%d",&cur_e);
if(PriorElem(L,cur_e,&pre_e)==FALSE)
printf("没有找到%d的前驱元素!\n",cur_e);
if(PriorElem(L,cur_e,&pre_e)==OK)
printf("%d的前驱元素为%d\n",cur_e,pre_e);
break;
}
case 6:
{
int cur_e;
ElemType next_e;
printf("请输入线性表中的一个元素:\n");
scanf("%d",&cur_e);
if(NextElem(L,cur_e,&next_e)==FALSE)
printf("没有找到%d的后继元素!\n",cur_e);
if(NextElem(L,cur_e,&next_e)==OK)
printf("%d的前驱元素为%d\n",cur_e,next_e);
break;
}
case 7:
{
int index;
ElemType e;
printf("请输入一个元素:\n");
scanf("%d",&e);
index=LocateElem(L,e,large);
if(index!=0)
printf("元素的位置为:%d\n",index);
else
if(index==0)
printf("没有找到!\n");
break;
}
case 8:
{
int num;
printf("请输入要删除第几个数:\n");
scanf("%d",&num);
if(DeleteList(&L,num,&e)==OK)
{
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
break;
}
case 9:
{
int location,num;
printf("请输入数的位置:\n");
scanf("%d",&location);
printf("请输入要插入的数:\n");
scanf("%d",&num);
if(InsertList(&L,location,num)==OK)
{
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
break;
}
case 10:
{
if(EmptyList(L)==OK)
printf("it is an empty list!\n");
else
printf("it is not an empty list!\n");
break;
}
case 11:
{
ClearList(&L);
break;
}
case 12:
{
if(DestroyList(&L)==OK)
printf("DestoyList succeed\n");
else
if(DestroyList(&L)==ERROR)
printf("DestroyList fail.\n");
break;
}
}
system("pause");
}
}