最近在学习数据结构,感觉应该将书上的伪代码进行实现,因此花了几个小时写了下顺序线性表的各种函数实现:
实现代码如下:
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
int InitList(SqList *L);//构造空的线性表
void DestroyList(SqList *L);//销毁一个线性表
void ClearList(SqList *L);//将L置为空表
int ListEmpty(SqList L);//空表返回ture
int ListLength(SqList L);//返回元素个数
int GetElem(SqList L,int i,ElemType *e);//用e返回第i个元素
int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType));
//在L中找到与compare()的元素的位序
int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e);//用pre_e返回cur_e的前驱
int NextElem(SqList L,ElemType cur_e,ElemType *next_e);//用next_e返回cur_e的后继
int ListInsert(SqList *L,int i,ElemType e);//在第i个位置插入新元素e
int ListDelete(SqList *L,int i,ElemType *e);//删除第i个元素并且用e返回
int InitList(SqList *L)
{
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem){
printf("构造失败!\n");
exit(OVERFLOW);
}
L->length=0;
L->listsize=LIST_INIT_SIZE;
printf("构造成功!\n");
return OK;
}
void DestroyList(SqList *L)
{
if(L->elem!=NULL)
{
free(L->elem);
L->length=0;
L->listsize=0;
printf("已摧毁线性表\n");
}
}
void ClearList(SqList *L)
{
if(L->elem!=NULL)
{
L->length=0;
printf("已将L置为空表\n");
}
}
int ListEmpty(SqList L)
{
if(L.elem!=NULL)
{
if(L.length == 0)
{
printf("是空表\n");
return TURE;
}
else
{
printf("不是空表\n");
return FALSE;
}
}
else exit(ERROR);
}
int ListLength(SqList L)
{
if(L.elem!=NULL)
{
return L.length;
}
else return ERROR;
}
int GetElem(SqList L,int i,ElemType *e)//用e返回第i个元素
{
if(ListEmpty(L))
{
printf("是空表\n");
return ERROR;
}
if(i<1||i>L.length)
{
printf("不存在第%d个位置!\n",i);
return ERROR;
}
*e=L.elem[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType))
//在L中找到与compare()的元素的位序
{
int i=0;
int *p=L.elem;
while(i<=L.length && !(*compare)(*p++,e))
{
++i;
}
if(i<=L.length) return i;
else return FALSE;
}
int PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)//用pre_e返回cur_e的前驱
{
int i=2;
while(i<=L.length)
{
if(cur_e == L.elem[i-1])
{
*pre_e=L.elem[i-2];
return OK;
}
i++;
}
return ERROR;
}
int NextElem(SqList L,ElemType cur_e,ElemType *next_e)//用next_e返回cur_e的后继
{
int i=1;
while(i<L.length)
{
if(cur_e == L.elem[i-1])
{
*next_e=L.elem[i];
return OK;
}
i++;
}
return ERROR;
}
int ListInsert(SqList *L,int i,ElemType e)//在第i个位置插入新元素e
{
ElemType *newbase,*p,*q;
if(i<1 || i>L->length+1)
{
return ERROR;
}
if(L->length>=L->listsize)
{
newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--)
{
*(p+1)=*p;
}
*q=e;
L->length++;
return OK;
}
int ListDelete(SqList *L,int i,ElemType *e)//删除第i个元素并且用e返回
{
ElemType *p,*q;
if(i<1 || i>L->length)
{
return ERROR;
}
q=&(L->elem[i-1]);
*e=*q;
for(p=q;p<&(L->elem[L->length-1]);p++)
{
*p=*(p+1);
}
L->length--;
return OK;
}
int main()
{
SqList L;
ElemType m,e=0,cur_e,pre_e,next_e;
char ch;
int k,j,n;
printf("初始化线性表...");
InitList(&L);
printf("是否销毁线性表L?Y/N?");
ch =getchar();
if(ch == 'Y' || ch == 'y')
{
DestroyList(&L);
return 0;
}
else
{
ClearList(&L);
for(int i=0;i<LISTINCREMENT;i++)
{
L.elem[i]=i+1;
L.length++;
}
printf("线性表的初始值为:\n");
for(int i=0;i<LISTINCREMENT;i++)
{
printf("%4d",L.elem[i]);
}
printf("\n");
printf("线性表内的元素个数为:%d\n",ListLength(L));
printf("欲想知道第k位的数字,请输入k=");
scanf("%d",&k);
j=GetElem(L,k,&e);
printf("第%d位的数字是:%d\n",k,e);
cur_e=e;
PriorElem(L,cur_e,&pre_e);
printf("%d的前驱是:%d\n",cur_e,pre_e);
NextElem(L,cur_e,&next_e);
printf("%d的后继是:%d\n",cur_e,next_e);
printf("请输入要插入的位数和要插入的数字:(格式a,b)");
scanf("%d,%d",&n,&m);
ListInsert(&L,n,m);
printf("插入后的线性表内的%d个数据为:\n",L.length);
for(int i=0;i<L.length;i++)
{
printf("%4d",L.elem[i]);
}
printf("\n");
ListDelete(&L,n,&m);
printf("删除线性表中第%d个数据%d后,线性表内%d个数据为:\n",n,m,L.length);
for(int i=0;i<L.length;i++)
{
printf("%4d",L.elem[i]);
}
printf("\n");
return 0;
}
}
这个代码在编译器里可以直接运行,写的过程有点太过仓促,如有不足还请大家多多指教。