实现单链表的各种基本运算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现单链表的各种基本运算

一、实验目的

了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。

二、实验内容

编写一个程序,实现顺序表的各种基本运算:

1、初始化单链表;

2、单链表的插入;

3、单链表的输出;

4、求单链表的长度

5、判断单链表是否为空;

6、输出单链表的第i位置的元素;

7、在单链表中查找一个给定元素在表中的位置;

8、单链表的删除; 9、释放单链表

三、算法思想与算法描述简图

四、实验步骤与算法实现

#include

#include

typedef char ElemType;

typedef struct LNode//定义单链表

{ ElemType data;

struct LNode *next;

}LinkList;

void InitList(LinkList*&L)

{ L=(LinkList*)malloc(sizeof(LinkList));//创建头结点

L->next=NULL;//头结点赋值为空

}

void DestroyList(LinkList*&L)//销毁单链表(释放单链表L占用的内存空间即逐一释放全部结点的空间)

{ LinkList*p=L,*q=p->next;

while(q!=NULL)

{free(p);

p=q;

q=p->next;}

free(p);

}

int ListEmpty(LinkList*L)//判线性表是否为空表ListEmpty(L)

{ return(L->next==NULL);}//若单链表L没有数据结点,则返回真,否则返回假。

int ListLength(LinkList*L)//求线性表的长度ListLength(L)

{ LinkList*p=L;int i=0;

while(p->next!=NULL)

{i++;

p=p->next;

}

return(i);//返回单链表L中数据结点的个数

}

void DispList(LinkList*L)//输出线性表DispList(L)

{LinkList*p=L->next;

while (p!=NULL)//逐一扫描单链表L的每个数据结点,并显示各结点的data域值。

{printf("%c",p->data);

p=p->next;

}

printf("\n");

}

int GetELem(LinkList*L,int i,ElemType&e)//求线性表L中指定位置的某个数据元素GetElem(L,i,&e)

{int j=0;

LinkList*p=L;

while(j

{j++;

p=p->next;

}

if(p==NULL)

return 0;//不存在第i个数据结点

else

{e=p->data;//存在第i个数据结点

return 1;

}

}

int LocateElem(LinkList*L,ElemType e)//按元素值查找LocateElem(L,e) {LinkList *p=L->next;

int n=1;

while (p!=NULL&&p->data!=e)//在单链表L中从头开始找第1个值域与e相等的结点,若存在这样的结点,则返回位置,否则返回0。

{p=p->next;

n++;

}

if(p=NULL)

return (0);

else

return (n);

}

int ListInsert(LinkList*&L,int i,ElemType e)//插入数据元素ListInsert(&L,i,e)

{int j=0;

LinkList*p=L,*s;

while(j

{j++;

p=p->next;

}

if(p==NULL)

return 0;//未找到位序为i-1的结点

else

{s=(LinkList*)malloc(sizeof(LinkList));

s->data=e;

s->next=p->next;//将*s插入到*p之后

p->next=s;

return 1;

}

}

int ListDelete(LinkList*&L,int i,ElemType &e)//删除数据元素ListDelete(&L,i,&e)

{int j=0;

LinkList*p=L,*q;

while(j

{j++;

p=p->next;}

if(p==NULL)//未找到位序为i-1的结点

return 0;

else//找到位序为i-1的结点*p

{q=p->next;//q指向要删除的结点

if(q==NULL)return 0;//若不存在第i个结点,返回0

e=q->data;

p->next=q->next;//从单链表中删除*q结点

free(q);//释放*q结点

return 1;

}

}

void main()

{

LinkList *h;

ElemType e;

printf("(1)初始化单链表h\n");

InitList(h);

printf("(2)依次采用尾插入abcd,efgh,jilk,nnnn,kkkk元素\n");

相关文档
最新文档