到了学校之后发现自己啥都不会,有点伤心了,罢了,开始进入正题:

设计算法实现将两个递增的带头结点有序链表合并为一个递增的有序链表,要求结果链表仍  然使用原来两个链表的存储空间,表中不允许有重复的数据。

来看看我的成品(大多数属于发牢骚,还有就是只有自己能听懂的语言),所以注释可以看下面。

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;//
typedef struct LNode
{ElemType data;struct LNode* next;} LNode,* LinkList;
void InitList(LinkList &L)
{L=(LinkList )malloc(sizeof(LNode));//就把它当作头节点L->next=NULL;}
void create(LinkList &L,int n)
{/*//前插法创建链表InitList(L);for(int i=0;i<n;i++){LNode *p=(LNode *)malloc(sizeof(LNode));scanf("%d",&(p->data));p->next=L->next;//前插法,新创一个空间,将这个空间连接原来的空间并消除原来空间的联系,相当于在原来的空间里面挤入了一个新空间L->next=p;}*/
//#include<bits/stdc++.h>
//这个头插法不行,要用尾插法InitList(L);LNode *r;r=L;for(int i=0; i<n; i++){LNode *p=(LNode *)malloc(sizeof(LNode));p->next=NULL;scanf("%d",&(p->data));r->next=p;r=p;//别忘了这一步;}}void MergeLost(LinkList &LA,LinkList &LB,LinkList &LC)
{LNode *pa=LA->next;LNode *pb=LB->next;LC=LA;//不合常理 LNode *pc=pa;LNode *pc=LC;while(pa&&pb){if(pa->data<=pb->data){//先后顺序很重要if(pa->data==pb->data)//这样就行了,题目为递增的,也就是最多出现一个重复的{//一定要重新写LNode *temp;temp=pb;pb=pb->next;// pc=pb;free(temp);pc->next=pa;pc=pa;//书上是说把这个c总是放在目前有元素的地方pa=pa->next;}// pa++;//最容易错的地方else{pc->next=pa;pc=pa;//书上是说把这个c总是放在目前有元素的地方pa=pa->next;}}else{pc->next=pb;pc=pb;pb=pb->next;}}if(pa)pc->next=pa;else if(pb)pc->next=pb;//看清条件!!!!!!!!free (LB);//别忘了要释放空间}
void print(LinkList L)
{LinkList p;//=(LinkList )(malloc(sizeof (LNode)));p=L->next;while(p){printf("%d ",p->data);p=p->next;}
}
int main()
{LinkList LA;LinkList LB;LinkList LC;create(LA,4);create(LB,4);MergeLost(LA,LB,LC);print(LC);return 0;}

先来说几个这个题目的引言哈哈,关于这个题,要注意,本来他就是算法题,只要写核心代码就行,之所以写的是完整代码,一是为了巩固之前自己学的,创建链表的知识,还有就是为了验证自己是否对这个算法真正理解,还有对题目的理解,所以我们先来注意一点,这个题目给了前提,两个表原本要都是递增的,所以在一个表中是没有重复的,但是两个表中可以有相同的,这也就为后面我们最多只要删除一个重复的数奠定了条件,别问我为什么 这么强调,因为自己的血泪史QAQ,感觉代码本身比他的解释更重要,主要是靠自己探索,所以我就简述一下思路和我自己写的时候犯的错。

首先就是思路吧:这个题目我们要有合并就必须先要有链表,所以先创建链表,别用前插法,因为前插法是键盘输入和插入的链表顺序显示出来是相反的,而且还有一点就是我们这个代码是专门为递增的链表合并的,所以这样合并后输出来就会是玩全没有顺序而言的东东,然后我们用后插法插入链表后,这时候我们就就解释一下核心代码的思路:

void MergeLost(LinkList &LA,LinkList &LB,LinkList &LC)
{LC=LA;//先将一个LC头结点指向链表的LA,然后再将pa,pb分别放在两个要合并的链表的首元结点上;LNode *pa=LA->next;LNode *pb=LB->next;//不合常理 LNode *pc=pa;//这里一般我们创建链表都是开始把指针放在头接点上,而这里虽然没有给LC分配空间但它其实就相当于建一个新链表,只不过空间用的是LA,LB的空间。LNode *pc=LC;while(pa&&pb)//把已经比完了较小的元素放进LC中,且让pc移到该元素上,再把pa或者pb移到待重新比较的元素上//比较pa,pb两个指针指向的元素的值。{//如果碰见LA和LB里面相等的元素,就将pb往后移同时把pa此是的元素放在LC里面,并让pa往后移;if(pa->data<=pb->data){if(pa->data==pb->data)//这样就行了,题目为递增的,也就是最多出现一个重复的{//一定要重新写LNode *temp;//temp=pb;//别想着把这两句串作为上下部分的公用,这也就是我一直没发现的错误,随着改变下面的判断条件也会变,这时候就改变了我们原来的意思。pb=pb->next;free(temp);pc->next=pa;pc=pa;//把这个pc总是放在目前有元素的地方pa=pa->next;}// pa++;//最容易错的地方,往后移不是加加TATelse{pc->next=pa;pc=pa;pa=pa->next;//这才是表示pa往后移,表示指向下一个已经建立了链表联系的元素}}else{pc->next=pb;pc=pb;//要了解链表的结构,这里就相当于pc=pb;pb=pb->next;}}if(pa)pc->next=pa;//如果pa还不为空,那么肯定就它后面的元素放在LC里面哈哈else if(pb)pc->next=pb;//看清条件!!!!!!!!free (LB);//别忘了要释放空间}

然后就打印就行了。

然后就是我写这个代码的时候犯的错误:1.我们创建的一般是头节点,除非没有头节点,而非头指针。

2.在插入数据的时候我们先对这个的数据附上原来链表的最后,然后再把这个数据和原链表建立联系,不可以颠倒顺序,不然就是错的;

3.每次插入一个数据的时候在最后都要记得把目前链表的指针放在该元素上,如果不放虽然对目前的这个元素没什么影响,但是到后面就有影响了;

4.还有就是,在打印函数的时候要先让一个指针和要打印的链表的头节点产生联系,再通过这个指针来引出数据,不然就会出错;

5.上面的可能光看完全不可以理解,到时候我会补上这些图便于理解。

相信如果能上这个网站看的文章的人都不是一般人,要时刻相信自己哦!!!

关于一个大学生写一个题目写一天相关推荐

  1. JAVA题目 写一个收费站类_Java综合题目

    分支, 循环, 数据类型 1, 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 2, 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13... ...

  2. 题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度。 程序的输入是一个整数,表示华氏温度。输出对

    #题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度. 程序的输入是一个整数,表示华氏温度.输出对应的摄氏温度, ...

  3. 题目39:请帮助Larry写一个程序,通过过去12个月中每月的月末结余,计算平均结余。

    题目转载:http://python.wzms.com/s/1/29 题目描述: Larry今年毕业并找到了一份工作.他赚很多钱,但似乎总是不够.Larry认为他需要控制他的投资以解决自己的财务问题. ...

  4. ACMNO.24 C语言-转置矩阵 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 样例

    题目描述 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换. 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 ...

  5. ACMNO.23 C语言-素数判定 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime

    题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 prime 来源/ ...

  6. 写一个ArrayList类的动态代理类

    动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象.动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑 ...

  7. C语言---写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

    题目: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串. #include <string.h> #include <stdio.h> void left_re ...

  8. 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码

    题目要求: 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码. 如("我ABC",4)应该截为"我AB", ...

  9. 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...

    弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...

  10. [007]C++---写一个函数,返回它自己

    题目: 写一个函数,返回它自身,方法用C或者C++即可. 方法一: 用C++中仿函数的方法,来实现返回自身的引用. 1 #include<iostream> 2 using namespa ...

最新文章

  1. R语言glmnet拟合lasso回归模型实战:lasso回归模型的模型系数及可视化、lasso回归模型分类评估计算(混淆矩阵、accuracy、Deviance)
  2. 欢迎给图灵教育微信平台投食
  3. h5封装去底部_干货分享 | 一步一步教你在SpringBoot中集成微信支付H5支付
  4. CSS3幻灯片制作心得
  5. 谭浩强c++程序设计知识点思维导图
  6. spring-bean(xml方式DI)
  7. Weblogic跨域session冲突解决办法
  8. 面试问题记录 2019.3.22(中国铁道科学研究院)
  9. 被弃用的 Docker 会被 Podman 取代吗?
  10. 如何在有线路由器下接无线路由
  11. 中级维修电工实训装置
  12. 约瑟夫问题的数学解法
  13. draft.js编辑器开发笔记
  14. Microsoft HoloLens 技术解谜(下)
  15. 也曾青春年少,小虎队
  16. [高数][高昆轮][高等数学上][第二章-导数与微分]04.隐函数及由参数方程所确定的函数的导数...
  17. MFC应用程序“生死因果”内幕
  18. c语言tft屏浮点数显示,LCD屏显示小数的程序与心得
  19. 解决谷歌的but your computer or network may be sending automated queries
  20. 别被骗了:物联网卡骗局无处不在

热门文章

  1. 亚马逊多账号操作,如何才能安全使用多账号?
  2. 搭建邮件服务器,该怎么选择邮件服务器软件呢?
  3. 计算机二级c语言蒙题技巧,计算机选择题蒙题技巧,计算机二级考试怎么自学...
  4. 特斯拉网上卖二手Model 3:能便宜1.5万美元
  5. 一维数组的逆序存放的两种方法
  6. 软件测试面试技巧 这么准备,拿下心仪offer不是问题
  7. [ESXi]各种ID:WID/LWID/CID/GID
  8. Latex 另起一段缩进,解决空白问题
  9. 修改用户表空间和临时表空间
  10. CorelDRAW2023最新工作室Win版矢量图形编辑与排版工具软件