合并两个链表c语言(设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性用c语言编写)
本文目录
- 设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性用c语言编写
- c语言合并两个有序单链表,使合并后的单链表非递增(或非递减)
- C语言链表合并:将两个有序单向链表合并为一个单向有序链表,要求分别用两种方式实现~急~求大神帮忙
- 用C语言实现两个线性链表的归并
- 求指导!C语言实现两个有序链表合并并输出
- C语言 把两个有序链表合并为一个有序链表(递增)
- 实现两个链表的合并
- C语言程序题:两个有序单链表的合并 合并之后仍然有序 如第一个链表13579 第二个链表
- 两递增链表合并的C语言代码如何编写
- c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点
设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性用c语言编写
#include 《stdio.h》#include 《malloc.h》typedef struct node{ int data; struct node *next;}List;List *create(List *head,int n)//创建链表 { List *p,*q; q=(List *)malloc(sizeof(List)); q-》data=n; q-》next=NULL; p=head; while(p-》next!=NULL)p=p-》next; p-》next=q; return head;}void print(List *head)//输出链表 { List *p; p=head-》next; while(p!=NULL) { printf("%d ",p-》data); p=p-》next; }}List *LINK(List *head1,List *head2)//连接链表 { List *p; p=head1; while(p-》next!=NULL)p=p-》next; p-》next=head2-》next; return head1;}main(){ int i; List *head1,*head2,*link1; head1=(List *)malloc(sizeof(List)); head1-》next=NULL; head2=(List *)malloc(sizeof(List)); head2-》next=NULL; for(i=1;i《=5;i++)head1=create(head1,i);//输入链表1 printf("链表1:\n"); print(head1); printf("\n链表2:\n"); for(i=6;i《=10;i++)head2=create(head2,i);//输入链表2 print(head2); link1=LINK(head1,head2); printf("\n连接后的链表:\n"); print(link1);}
c语言合并两个有序单链表,使合并后的单链表非递增(或非递减)
#include《stdio.h》
#include《malloc.h》
typedef struct list {
int data;
struct list * next; //下一个节点地址
}list;
//第一条链表
struct list * L=NULL;//头
struct list * head=NULL;//首
struct list * p=NULL;
//第二条链表
struct list * L1=NULL;//头
struct list * head1=NULL;//首
struct list * p1=NULL;
//代理链表
struct list * L2=NULL;//头
struct list * q=NULL;
int main(){
int i=0,length;
printf("请输入链表的长度\n");
scanf("%d",&length);
head=(struct list *)malloc(sizeof(struct list));
L=head;
printf("请依次输入链表的内容\n");
for(i;i《length;i++){
p = (struct list *)malloc(sizeof(struct list));
scanf("%d",&p-》data);
p-》next=NULL;
head-》next=p;
head=p;
}
int i1=0,length1;
printf("请输入链表的长度\n");
scanf("%d",&length1);
head1=(struct list *)malloc(sizeof(struct list));
L1=head1;
printf("请依次输入链表的内容\n");
for(i1;i1《length1;i1++){
p1= (struct list *)malloc(sizeof(struct list));
scanf("%d",&p1-》data);
p1-》next=NULL;
head1-》next=p1;
head1=p1;
}
p=L-》next;//得到首原节点
p1=L1-》next;//得到首原节点
L2=(struct list *)malloc(sizeof(struct list));
L2=L;//指向已有链表空间
L2-》next=NULL;
q=(struct list *)malloc(sizeof(struct list));
//循环里主要是 头插法原理
while(p||p1){
if(!p){
q=p1;
p1=p1-》next;
}
else if(!p1){
q=p;
p=p-》next;
}else if(p-》data《=p1-》data){
q=p;
p=p-》next;
}else{
q=p1;
p1=p1-》next;
}
q-》next = L2-》next;
L2-》next=q;
}
free(L1);
p=L2-》next;
while(p){
printf("%d ",p-》data);
p=p-》next;
}
}
- #include《stdio.h》#include《malloc.h》 typedef struct list {int data;struct list * next; //下一个节点地址 }list; //第一条链表 struct list * L=NULL;//头struct list * head=NULL;//首struct list * p=NULL; //第二条链表struct list * L1=NULL;//头struct list * head1=NULL;//首struct list * p1=NULL; //代理链表struct list * L2=NULL;//头struct list * q=NULL;int main(){int i=0,length;printf("请输入链表的长度\n");scanf("%d",&length);head=(struct list *)malloc(sizeof(struct list));L=head;printf("请依次输入链表的内容\n");for(i;i《length;i++){p = (struct list *)malloc(sizeof(struct list));scanf("%d",&p-》data);p-》next=NULL;head-》next=p;head=p;}int i1=0,length1;printf("请输入链表的长度\n");scanf("%d",&length1);head1=(struct list *)malloc(sizeof(struct list));L1=head1;printf("请依次输入链表的内容\n");for(i1;i1《length1;i1++){p1= (struct list *)malloc(sizeof(struct list));scanf("%d",&p1-》data);p1-》next=NULL;head1-》next=p1;head1=p1;}p=L-》next;//得到首原节点p1=L1-》next;//得到首原节点L2=(struct list *)malloc(sizeof(struct list));L2=L;//指向已有链表空间L2-》next=NULL;q=(struct list *)malloc(sizeof(struct list));//循环里主要是 头插法原理while(p||p1){if(!p){q=p1;p1=p1-》next;}else if(!p1){q=p;p=p-》next;}else if(p-》data《=p1-》data){q=p;p=p-》next;}else{q=p1;p1=p1-》next;}q-》next = L2-》next;L2-》next=q;}free(L1);p=L2-》next;while(p){printf("%d ",p-》data);p=p-》next;}}
C语言链表合并:将两个有序单向链表合并为一个单向有序链表,要求分别用两种方式实现~急~求大神帮忙
小意思!有个前提,两个链表的数据类型都是一样的哦第一种:先新建一个链表,然后遍历第一链表,同时把它的值都赋给新建的链表,然后,开始第二个链表,也是同样的办法。加上第二个的时候,先找到新建链表的表尾,再表尾处开始添加第二个第二种:首先遍历第一个链表,找到表尾,然后去掉第二个链表的表头,把第二个链表的头部赋给第一个链表的尾部 //当然,如果没有表头什么的就直接把第一个节点赋给第一个就行了。第二种方法之后,两个链表就合成一个了。
用C语言实现两个线性链表的归并
以前学数据结构做过一个“非递减的链表合并一一个非递增的链表”程序如下:#include 《stdio.h》#include 《stdlib.h》typedef struct node{ int data; struct node *next;}LinkList;/* 建立链表 */LinkList *create_link(int m){ LinkList *head,*s,*p; int i; head=(LinkList *)malloc(sizeof(LinkList)); head-》next=NULL; p=head; for(i=0;i《m;i++){ s=(LinkList *)malloc(sizeof(LinkList)); if(s==NULL){ printf("failed.\n"); exit(0); } scanf("%d",&s-》data); s-》next=NULL; p-》next=s; p=s; } return head;}/* 2个非递减的链表合并一一个非递增的链表 */LinkList *add_link(LinkList *head1,LinkList *head2,LinkList *head){ LinkList *p1,*p2,*q; p1=head1-》next; p2=head2-》next; head=q=head1; q-》next=NULL; while(p1&&p2){ if(p1-》data《=p2-》data){ q=p1; p1=p1-》next; } else{ q=p2; p2=p2-》next; } q-》next=head1-》next; head1-》next=q; } while(p1) {q=p1; p1=p1-》next; q-》next=head1-》next; head1-》next=q;} while(p2) {q=p2; p2=p2-》next; q-》next=head1-》next; head1-》next=q;}return head;}/* 打印链表 */void print_link(LinkList *head){ LinkList *p; p=head-》next; if(!p){ printf("Link is NULL.\n"); exit(0); } while(p){ printf("%d ",p-》data); p=p-》next; }}int main(void){ LinkList *head,*head1,*head2; int m,n; printf("input length of Link1:"); scanf("%d",&m); head=create_link(m); print_link(head); printf("\n"); printf("input length of Link2:"); scanf("%d",&n); head1=create_link(n); print_link(head1); printf("\n");head2=add_link(head,head1,head2); print_link(head2); getchar(); getchar(); return 0;}
求指导!C语言实现两个有序链表合并并输出
二路归并啊 你思路是正确的while(pa && pb){ //这句之前,你要pa=pa-》next;pb=pb-》next,因为两个都有一个头结点不需要比较其余的没看出什么问题来 补充:早点贴出图来。。。帮你修改好了#include《stdio.h》#include《stdlib.h》typedef struct LNode{int data;struct LNode *link;}NODE,* LinkList;//建立单链表LinkList Create_Node(){LinkList head,p,pre;pre = head = (LinkList) malloc(sizeof(NODE));pre-》link = NULL;int a;while((scanf("%d",&a)) != EOF){p = (LinkList) malloc(sizeof(NODE));p-》data = a;p-》link = NULL;pre-》link = p;pre = pre-》link;}return head;} //合并两个有序链表LinkList MergeList_L(){LinkList pa,pb,pc,head;pa = Create_Node();pb = Create_Node(); head = pc = (LinkList)malloc(sizeof(NODE)); pc-》link = NULL;pa=pa-》link;//不比较头结点pb=pb-》link;while(pa && pb){if(pa-》data 《= pb-》data){if(pa-》data!=pc-》data)//加个判断,是否跟上一个元素相同{pc-》link = pa; pc = pa; //用La的头结点作为Lc的头结点}pa=pa-》link;}else{if(pb-》data!=pc-》data){pc-》link = pb; pc = pb; }pb = pb-》link;}}//pc-》link = pa ? pa : pb; //插入剩余段while(pa){if(pc-》data!=pa-》data){pc-》link=pa;pc=pa;}pa=pa-》link;}while(pb){if(pc-》data!=pb-》data){pc-》link=pb;pc=pb;}pb=pb-》link;}return head;} //依次打印链表中的每个值int Print_L(LinkList head){LinkList p;p = head-》link;printf("%d",p-》data);p = p-》link;do{printf(" %d",p-》data);p = p-》link;} while(p-》link != NULL);printf(" %d",p-》data);system("pause");return 0;}int main(){LinkList Lc;Lc = MergeList_L();Print_L(Lc);return 0;}
C语言 把两个有序链表合并为一个有序链表(递增)
设链表结点结构为Node(int data, Node *next),typedef Node List,链表均带表头结点。
思路是:把list1中的元素看成是集合1,把list2中的元素看成是集合2,把list1头结点(即list1结点)从集合1中脱离下来看成是目标集合的头结点,目标集合开始时是空集,并用last指针始终指向该集合的尾部,然后每次从集合1和集合2中取各自的第一个元素进行比较,较小者从相应集合里脱离,插入到目标集合list1的尾部即last的末尾,并将刚插入的元素作为目标集合list1的新的last,直到集合1为空或集合2为空时结束,最后将未空的集合中的剩余元素链接到last后面即可。
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。
C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。
实现两个链表的合并
一、 需求分析: 题目: 实现两个链表的合并 问题描述: 1. 建立两个链表 A 和 B,链表元素个数分别为 m 和 n 个。 2. 假设元素分别为(x1,x2,„xm),和(y1,y2, „yn)。把它 们合并成一个线形表 C,使得: 当 m》=n 时,C=x1,y1,x2,y2,„xn,yn,„,xm 当 n》m 时,C=y1,x1,y2,x2,„ym,xm,„,yn 输出线性表 C。 由题目的相关信息可以分析得到:首先我们需要建立两个链 表 AB,A 链表的元素个数为 m;B 链表的元素个数为 n;在将 A\B 链 表进行合并,更具 m 和 n 的大小关系决定链表 C 的元素顺序;再将 C 经行直接插入排序得到一个新的链表 D;最后输出 ABCD 的相关信 息。 二、 算法的流程图 开始 Creat A 链表 B 链表 Creat Mergel(A,B) 合并成 C 对 C 排序生成 D
C语言程序题:两个有序单链表的合并 合并之后仍然有序 如第一个链表13579 第二个链表
ListNode*ReNewCombineList(ListNode*p1,ListNode*p2)//合并两个链表,,生成第三个链表递归
{
ListNode*pNewList=NULL;
//ListNode*p3=NULL;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
if(p1-》data《p2-》data)
{
pNewList=p1;
pNewList-》next=ReNewCombineList(p1-》next,p2);
}
else
{
pNewList=p2;
pNewList-》next=ReNewCombineList(p1,p2-》next);
}
return pNewList;
}
扩展资料:
return
C++的关键字,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值.
说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.
很多人甚至市面上的一些书籍,都使用了void main(),其实这是错误的。C/C++中从来没有定义过void main()。
C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main(){/*...*/}is not and never has been C++,
nor has it even been C.(void main()从来就不存在于C++或者C)。下面我分别说一下C和C++标准中对main函数的定义。
1.C
在C89中,main()是可以接受的。Brian W.Kernighan和Dennis M.Ritchie的经典巨著The C programming Language 2e(《C程序设计语言第二版》)用的就是main()。不过在最新的C99标准中,只有以下两种定义方式是正确的:
int main(void)
int main(int argc,char*argv)
(参考资料:ISO/IEC 9899:1999(E)Programming languages—C 5.1.2.2.1 Program startup)
当然,我们也可以做一点小小的改动。例如:char*argv可以写成char**argv;argv和argc可以改成别的变量名(如intval和charval),不过一定要符合变量的命名规则。
如果不需要从命令行中获取参数,请用int main(void);否则请用int main(int argc,char*argv)。
main函数的返回值类型必须是int,这样返回值才能传递给程序的激活者(如操作系统)。
如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return 0;,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。
注意,vc6不会在目标文件中加入return 0;,大概是因为vc6是98年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上return语句了吧!不过,gcc3.2(Linux下的C编译器)会在生成的目标文件中加入return 0;。
两递增链表合并的C语言代码如何编写
#include《stdio.h》#include《stdlib.h》typedef struct node{ int data; struct node*next;}*linklist,list;linklist Create(){ linklist head,temp,p; int i,n; printf("输入节点的个数:"); scanf("%d",&n); head=(linklist)malloc(sizeof(list)); temp=head; for(i=0;i《n;i++) { p=(linklist)malloc(sizeof(list)); scanf("%d",&p-》data); temp-》next=p; temp=p; } p-》next=NULL; return head;
}linklist MergeList(linklist head1,linklist head2){ linklist p1=head1-》next; linklist p2=head2-》next; linklist temp=head1; while(p1!=NULL&&p2!=NULL) { if(p1-》data《p2-》data) { temp-》next=p1; temp=p1; p1=p1-》next; } else { temp-》next=p2; temp=p2; p2=p2-》next; } } while(p1!=NULL) { temp-》next=p1; temp=p1; p1=p1-》next; } while(p2!=NULL) { temp-》next=p2; temp=p2; p2=p2-》next; } temp-》next=NULL; return head1;
}void ShowList(linklist head){ linklist p=head-》next; while(p!=NULL) { printf("%d ",p-》data); p=p-》next; } printf("\n");}void main(){ linklist head1,head2; head1=Create(); ShowList(head1); head2=Create(); ShowList(head2); head1=MergeList(head1,head2); printf("归并后:"); ShowList(head1);
}
c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点
#include 《stdio.h》#include 《stdlib.h》typedef struct lnode{ int data; struct lnode *next;}lnode,*linklist;linklist mergelist_l(linklist la,linklist lb){linklist lc;linklist pa,pb,pc;pa=la-》next;pb=lb;lc=la;lc-》next=NULL;while(pa&&pb){if(pa-》data《=pb-》data){pc=pa;pa=pa-》next;}else { pc=pb; pb=pb-》next;}pc-》next=lc-》next;lc-》next=pc;}if(pa==NULL) pa=pb; while(pa) { pc=pa; pa=pa-》next; pc-》next=lc-》next; lc-》next=pc; } lc=sort(lc); printf("合并后的链表为:\n");while(lc!=NULL){ printf("%d ",lc-》data);lc=lc-》next; }printf("\n"); return 0;}linklist createlist_l(linklist l){linklist s,r=NULL;int e,flag=-99;l=NULL;printf("输入链表以-99结束:\n");scanf("%d",&e);while(e!=flag){s=(linklist)malloc(sizeof(lnode));s-》data=e;if(l==NULL) l=s;else r-》next=s;r=s;scanf("%d",&e);}if(r!=NULL)r-》next=NULL;return l;}int sort(linklist l){linklist p,q,small;int temp;for(p=l;p-》next!=NULL;p=p-》next){small=p;for(q=p-》next;q!=NULL;q=q-》next)if(q-》data《small-》data) small=q; if(small!=p){ temp=p-》data; p-》data=small-》data; small-》data=temp;}}return l;}void main(){linklist la,lb;la=createlist_l(la);lb=createlist_l(lb);/*la=sort(la);lb=sort(lb);*/mergelist_l(la,lb);}这是我做的,你可以参考下,希望对你有帮助!
更多文章:
联想乐pad a1 07(联想乐pada107刷机包精简下载)
2024年7月8日 19:26
3000元笔记本电脑推荐(3000元笔记本电脑推荐2023)
2024年7月14日 19:06
三星平板电脑p7510(三星平板电脑p7510能升级到多大版本)
2024年7月23日 18:19