收藏 分享(赏)

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

上传人:buyk185 文档编号:6214962 上传时间:2019-04-02 格式:DOC 页数:11 大小:78.31KB
下载 相关 举报
实现单链表的各种基本运算.doc_第1页
第1页 / 共11页
实现单链表的各种基本运算.doc_第2页
第2页 / 共11页
实现单链表的各种基本运算.doc_第3页
第3页 / 共11页
实现单链表的各种基本运算.doc_第4页
第4页 / 共11页
实现单链表的各种基本运算.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、 实现单链表的各种基本运算一、实验目的了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。二、实验内容编写一个程序,实现顺序表的各种基本运算: 1、初始化单链表; 2、单链表的插入;3、单链表的输出; 4、求单链表的长度5、判断单链表是否为空; 6、输出单链表的第 i 位置的元素 ; 7、在单链表中查找一个给定元素在表中的位置;8、单链表的删除; 9、释放单链表三、算法思想与算法描述简图主函数 mainvoid InitList(LinkList*typedef struct LNode/定义单链表 ElemType data;struct LNode *next;Li

2、nkList;void InitList(LinkList*/创建头结点L-next=NULL;/头结点赋值为空void DestroyList(LinkList*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-ne

3、xt!=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,ElemTypeLinkList*p=L;while(jnext;if(p=NULL)return 0;/不存在第 i 个数据结点elsee=

4、p-data;/存在第 i 个数据结点return 1;int LocateElem(LinkList*L,ElemType e)/按元素值查找 LocateElem(L,e)LinkList *p=L-next;int n=1;while (p!=NULLn+;if(p=NULL)return (0);else return (n);int ListInsert(LinkList*LinkList*p=L,*s;while(jnext;if(p=NULL)return 0;/未找到位序为 i-1 的结点elses=(LinkList*)malloc(sizeof(LinkList);s-da

5、ta=e;s-next=p-next;/将*s 插入到*p 之后p-next=s;return 1;int ListDelete(LinkList*LinkList*p=L,*q;while(jnext;if(p=NULL)/未找到位序为 i-1 的结点return 0;else/找到位序为 i-1 的结点*pq=p-next;/q 指向要删除的结点if(q=NULL)return 0;/若不存在第 i 个结点,返回 0e=q-data;p-next=q-next;/从单链表中删除*q 结点free(q);/释放*q 结点return 1;void main()LinkList *h;Elem

6、Type e;printf(“(1)初始化单链表 hn“);InitList(h);printf(“(2)依次采用尾插入 abcd,efgh,jilk,nnnn,kkkk 元素n“);ListInsert(h,1,abcd);ListInsert(h,2,efgh);ListInsert(h,3,jilk);ListInsert(h,4,nnnn);ListInsert(h,5,kkkk);printf(“(3)输出单链表 h:“);DispList(h);printf(“(4)单链表 h 长度=%dn“,ListLength(h);printf(“(5)单链表 h 为%sn“,(ListEm

7、pty(h)?“空“:“非空“);GetELem(h,3,e);printf(“(6)单链表 h 的第三个元素=%cn“,e);printf(“(7)元素 a 的位置=%dn“,LocateElem(h,a);printf(“(8)在第四个元素的位置上插入 9 元素n“);ListInsert(h,4,9);printf(“(9)输出单链表 h:“);DispList(h);printf(“(10)删除 h 的第三个元素n“);ListDelete(h,3,e);printf(“(11)输出单链表 h:“);DispList(h);printf(“(12)释放单链表 hn“);DestroyL

8、ist(h);五、实验测试及结果六、思考题1、 单链表有带头结点和不带头结点两种形式,则相应的操作实现有何区别?答:在带头节点的单链表中,头指针(head)只有一个域,即链指针,它指向头结点,头结点有两个域,一个是数据域,值为 0(NULL) ,还有一个域,链指针,这个链指针指向单链表的第一个数据元素。 而在不带头结点的单链表中,头指针也只有一个链指针,但它指向单链表的第一个数据元素。2、单向循环链表、双向链表、双向循环链表基本操作的实现。答:(1)单向循环链表循环链表的基本运算实现算法与非循环链表的算法基本相同,只是对表尾的判断作了改变。因此单向循环链表与单链表基本上操作相同,只不过表尾的条

9、件将发生变化。(2)双向链表基本操作实现双链表中有两个指针域,一个指向其直接后继结点,另一个指向其直接前驱结点。建立双链表有头插法和尾插法。【1】 头插法:Void CreateListF(DLinkList *int i;L=(DLinkList *)malloc(sizeof(DLinkList);L-prior=L-next=NULL;for(i=0;idata=ai;s-next=L-next;if(L-next!=NULL)L-next=L-prior=s;L-next=s;s-prior=L;【2】 尾插法Void CreateListF(DLinkList *int I;L=(D

10、LinkList *)malloc(sizeof(DLinkList);L-prior=L-next=NULL;r=L;/r 始终指向尾结点,开始时指向头结点for(i=0;idata=ai;r-next=s;s-prior=r;r=s;r-next=NULL;在双链表中,大部分基本操作运算与单链表相同,除插入与删除有所区别。【插入】int ListInsert(DLinkList *DLinkList *p=L,*s;/p 指向头结点While(jnext;if(p=NULL)/未找到逻辑位序位 i-1 的结点return 0;else /找到逻辑位序为 i-1 的结点*ps=(DLinkL

11、ist *)malloc(sizeof(DLinkList)/创建结点*s;s-data=e;s-next=p-next;/将*s 插入到*p 之后if(p-next!=NULL)p-next-prior=s;s-prior=p;p-next=s;return 1;【删除】int ListDelete(DLinkList * /p 指向头结点int j=0;while (jnext;if(p=NULL)return 0;else q=p-next;if(q=NULL)return 0;e=q-data;p-next=q-next;/从单链表中删除*q 结点if (p-next!=NULL)p-

12、next-prior=p;free(q);/释放*p 结点return 1;(2)双向循环链表实现:插入操作 (在 p 所指结点之前插入 q 结点的过程 )Status ListInsert_Dl(DLinkList if (!(q = (DuLNode)malloc(sizeof(DuLNode) return ERROR;q-data = x;q-prior = p-prior; p-prior-next = q;q-next = p; p-prior = q;return OK;删除操作算法 (删除 p 所指向的结点)Status ListDelete_Dul(DuLinkList x = p-data;(p-prior)-next = p-next;(p-next)-prior = p-prior;free(p);return OK;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初级教育 > 小学教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报