单链表中重复元素的删除8817.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE PAGE 3 单链表中重复元素的删除(8817) 一、题目 1、问题描述 按照数据输入的顺序建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最初输入的一个)。 2、输入 第一行输入元素个数n;第二行输入n个整数;处理到文件结束。 3、输出 第1行输出删除重复元素后的单链表元素个数; 第2行输出删除重复元素后的单链表; 4、输入例 10 21 30 14 55 32 63 11 30 55 30 5、输出例 7 21 30 14 55 32 63 11 二、算法指导 1、数据结构 根据题目要求,数据要存储于单链表,首先要确定建立的单链表的结点类型,结点类型可为: typedef struct node { int data; node *next; }*linklist; 这里的linklist为指针类型,其变量为指向node的结点。 2、算法思路 (1) 设计初始化单链表的函数int initlist_l(linklist l);以建立带头结点的空单链表。 int initlist_l(linklist l) { // 构造一个带头结点的空单链表l,l是引用参数,是变参,其值其他函数要用。 } (2) 设计建立有n个结点的单链表函数void createlist_l(linklist l,int n)。可用后插法建立单链表。这里的l开始时已指向单链表的头结点,l的值已不会变,所以只要值参就可以。n为要建立的非降序排列单链表的结点个数,由主函数传入。 void createlist_l(linklist l,int n) { for(n次重复做) { 输入数据d; 产生新结点p,并把d 赋值给p; 把新结点p链接到链表l的尾部; } } (3) 输出单链表。 void print(linklist l) { // 按输出格式要求输出单链表l中结点的值 } (4) 设计单链表中重复元素的删除的函数void dele(linklist la,int n),la为单链表,n为la中的结点个数,删除重复结点后,n的值要减小,其值要函数外面要用,所以用引用参数。其算法思想是从la的第一个结点开始的各结点,依次与其后面的各个结点比较,若其值相等,则将其后面的结点删除。要注意到删除结点时,不要断链,既要删除结点,也要抓住被删除结点的后面的结点,以便继续处理。 void dele(linklist la,int n) { p指向la表的第一个结点;// 从la的第一个结点开始的各结点 while(p不空) // 扫描la表中的各结点 { p2指向p的下一个结点; // 准备扫描p的后续结点 p1取p的值; // p1跟在p2的后面,准备链接被删结点的后一结点; while(p2不空) // 扫描p的各后续结点 { if(p所指结点的值等于p2所指结点的值) // 找到重复结点 { p2所指结点的后一结点链接在p1结点后面;// 绕过重复结点 p2指向其下一结点; // 为继续扫描准备 删除重复结点(原p2所指结点); 链表的结点数减一; } else { p2指向其下一个结点; // 准备扫描下一个结点 p1跟在p2的后面; } } p指向其下一个结点; // 准备检查下一个结点是否有重复结点 } } 3、主函数 main() { 调用initlist_l(),初始化单链表la; 调用createlist_l(),建立有n个结点的单链表la; 调用dele(),删除la 中的重复结点; 输出删除la中结点后的结点个数; 调用print(),输出删除重复结点后的单链表la; }

文档评论(0)

zhang0711 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档