本代码根据严蔚敏数据结构书上的代码进行修改而成。该代码符合以下要求:
- 空表删除、查询、求长度报错;
- 添加表首和表尾位置能否成功,其它添加位置能否成功;过小或过大的添加位置报错;
- 删除表首和表尾位置能否成功,其它删除位置能否成功;过小或过大的删除位置报错;
- 查找成功和查找失败是否均能正确显示;
//编写人:naruuu
//编写功能:线性表的链式表示(单链表)与实现
#include <stdio.h> //将stdio.h包含到本程序中
#define OK 1
#define ERROR -1
#define ElemType int
#define Status int
typedef struct node {
ElemType data; //结点的数据域
struct node *next;//结点的指针域
}LNode, *LinkList;
Status InitList(LinkList &L) { //算法2.6 单链表的初始化
//构造一个空链表L
L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
L->next=NULL;
return OK;
}
Status LinkLength(LinkList L)//单链表长度计算
{
int k=0;
while(L->next!=NULL)
{
k++;
L=L->next;
}
return k;
}
Status GetElem(LinkList L, int i, ElemType &e) {//算法2.7 单链表的取值
LinkList p;
int j;
p=L->next; j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("error");
e=0;
return 0;
}
e=p->data;
return OK;
}
Status LocateElem(LinkList L, ElemType e) {//算法2.8 单链表的按值查找
LinkList p=L->next;
int i=0;
while(p&&p->data!=e)
{
p=p->next;
++i;
}
if(i==LinkLength(L))
{
printf("the num don't exsit in the LinkList");
return NULL;
}
else
{
printf("the num's location in the LinkList is:");
return i+1;
}
}
Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
LinkList s,p=L;
int j=0;
while(p && j<i-1){
p=p->next;
++j;
}
if(!p || j>i-1)
{
printf("error\n");
return ERROR;
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList &L, int i,ElemType &e) { //算法2.10 单链表的删除
LinkList q,p=L;int j=0;
while(p->next && j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
{
printf("error");
e=0;
return ERROR;
}
q=p->next;
p->next=q->next;
e=q->data;
delete q;
return OK;
}
void main()
{
LinkList L;
ElemType e;
ElemType length;
int tmp;
InitList(L);//初始化L,顺序表在使用之前必须用Init初始化
GetElem(L,1,e);printf("%d\n",e);
length=LinkLength(L);printf("the length is:%d\n",length);//空表长度
tmp=LocateElem(L,20);printf("%d\n",tmp);//空表 无该元素 报错
ListInsert(L,1,10); ListInsert(L,2,20);ListInsert(L,3,30);//依次添加10,20,30
ListInsert(L,0,10);//过小添加 报错
length=LinkLength(L);printf("the length is :%d\n",length);//插入元素后 表的长度
GetElem(L,1,e);printf("%d\n",e);
GetElem(L,4,e);printf("%d\n",e);//表内没有这两个元素 报错
GetElem(L,0,e);printf("%d\n",e);
tmp=LocateElem(L,20);printf("%d\n",tmp);
tmp=LocateElem(L,0);printf("%d\n",tmp);
tmp=LocateElem(L,40);printf("%d\n",tmp);//没有该元素 报错
ListDelete(L,1,e);printf("%d\n",e);
ListDelete(L,2,e);printf("%d\n",e);
ListDelete(L,1,e);printf("%d\n",e);
ListDelete(L,1,e);printf("%d\n",e);
ListDelete(L,4,e);printf("%d\n",e);
//没有该元素 会报错
}
/*
测试结果:
error0
the length is:0
the num don't exsit in the LinkList0
error
the length is :3
10
error0
error0
the num's location in the LinkList is:2
the num don't exsit in the LinkList0
the num don't exsit in the LinkList0
10
30
20
error0
error0
*/