第2章线性表基本操作.pptVIP

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章线性表基本操作

三、线性链表——单链表基本操作(9) 9.删除某个特定数据元素(O(1)) int DeleteElem(LINKLIST L, elemtype e) {/*将链表L中数据域是e的结点删除掉*/ NODEPTR p,pre; p=SearchLinklist(L,e,pre); /*查找数据域是e的结点及其前驱,返回结点指针*/ if(p==NULL) return 0;/*操作失败,没有找到*/ pre-next=p-next; /*摘除结点p*/ free(p); /*释放结点p*/ return 1; } 三、线性链表——单链表的应用(1) 程序功能:首先创建一个升序排序的有序链表,创建完毕后遍历整个链表,查看是否按照升序输出,最后销毁链表。 void CreateSortedLinklist(void) { LINKLIST L; NODEPTR p,q; elemtype e; InitLinklist(L); /*初始化链表L*/ 三、线性链表——单链表的应用(2) while(1) {/*接受多次输入,将输入的数据按照升序序列插入链表L中,输入0表示终止*/ scanf(%d,e);/*假定elemtype是指int型*/ if(e==0)break; /*终止输入*/ p=(NODEPTR)malloc(sizeof(NODE));/*为e分配结点*/ p-data=e; q=L;/*q指向L的头结点*/ /*下面的while语句在寻找第一个比e大的结点,将e插入到它的前面*/ while(q-next!=NULLeq-next-data) q=q-next; /*如果q-next是结点并且它的数据域比e小,q就向后移动一个单元*/ /*这时,q-next要么是NULL,要么q-next的数据域大于等于e。 无论哪种情况,p都应该插入到q的后面*/ p-next=q-next;/*这两步操作读者应该很熟悉了*/ q-next=p; } 三、线性链表——单链表的应用(3) TraverseLinklist(L); /*遍历输出链表L*/ printf(\n); DestroyLinklist(L); /*销毁链表L*/ } 三、线性链表——双向链表数据类型定义 typedef struct node_tag { elemtype data; struct node_tag *next, *prior;/*next指向后继,prior指向前驱*/ }DBNODE, *DBNODEPTR, *DBLINKLIST; 三、线性链表——双向链表的操作(1) 1.删除双向链表中的某个结点 void DeleteElem(DBNODEPTR p) {/*p是某双向链表中的结点,将p从链表中摘除并释放结点内存*/ DBNODEPTR pre; pre=p-prior; /*pre指向p的前驱*/ if(pre!=NULL) pre-next=p-next; /*①*/ if(p-next!=NULL) p-next-prior=pre; /*②*/ free(p);/*释放p结点内存*/ } 三、线性链表——双向链表的操作(2) 2.将数据元素插入到双向链表中结点p的后面 int InsertElemAfter(DBNODEPTR p, elemtype e) {/*将数据元素e插入到某双向链表中结点p的后面*/ DBNODEPTR q; q=(DBNODEPTR)malloc(sizeof(DBNODE));/*分配结点*/ if(q==NULL)return 0; q-data=e; q-next=p-next;/*①*/ q-prior=p; /*②*/ if(p-next!=NULL) p-next-prior=q;/*③*/ p-next=q; /*④*/ return 1; } 三、线性链表——循环链表 四、线性链表的应用案例(1) 任务:编程完成两个多项式的相加。比如输入的多项式是“15X5+6X3-3X2+1”和“9X4-4X3+3X2+5”,相加的结果是“15X5+9X4+2X3+6”。 程序清单: typedef struct {float coef; int exp; } elemtype; typedef struct node_tag {elemtype data; struct node_tag *next; }NODE, *NODEPTR, *LINKLIST; 四、线性链表的应用案例(2) void TraverseLinklist(LI

文档评论(0)

wyw118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档