合并两个链表c语言(c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点)
本文目录
- c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点
- 求指导!C语言实现两个有序链表合并并输出
- c语言合并两个有序单链表,使合并后的单链表非递增(或非递减)
- C语言 把两个有序链表合并为一个有序链表(递增)
- 设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性用c语言编写
- 两递增链表合并的C语言代码如何编写
- C语言链表合并:将两个有序单向链表合并为一个单向有序链表,要求分别用两种方式实现~急~求大神帮忙
- C语言程序题:两个有序单链表的合并 合并之后仍然有序 如第一个链表13579 第二个链表
- 用C语言实现两个线性链表的归并
c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点
#include 《*****》
#include 《*****》
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,**all;
int temp;
for(p=l;p-》next!=NULL;p=p-》next)
{
**all=p;
for(q=p-》next;q!=NULL;q=q-》next)
if(q-》data《**all-》data)
**all=q;
if(**all!=p)
{
temp=p-》data;
p-》data=**all-》data;
**all-》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);
}
这是我做的,你可以参考下,希望对你有帮助!
求指导!C语言实现两个有序链表合并并输出
二路归并啊 你思路是正确的
while(pa && pb){ //这句之前,你要pa=pa-》next;pb=pb-》next,因为两个都有一个头结点不需要比较
其余的没看出什么问题来
补充:早点贴出图来。。。帮你修改好了
#include《*****》
#include《*****》
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语言合并两个有序单链表,使合并后的单链表非递增(或非递减)
#include《*****》
#include《*****》
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;
}
****(L1);
p=L2-》next;
while(p){
printf("%d ",p-》data);
p=p-》next;
}
}
- #include《*****》
#include《*****》
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;
}
****(L1);
p=L2-》next;
while(p){
printf("%d ",p-》data);
p=p-》next;
}
}
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语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的*****于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。
C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。
设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性用c语言编写
#include 《*****》
#include 《*****》
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《*****》
#include《*****》
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语言链表合并:将两个有序单向链表合并为一个单向有序链表,要求分别用两种方式实现~急~求大神帮忙
小意思!有个前提,两个链表的数据类型都是一样的哦
第一种:先新建一个链表,然后遍历第一链表,同时把它的值都赋给新建的链表,然后,开始第二个链表,也是同样的办法。加上第二个的时候,先找到新建链表的表尾,再表尾处开始添加第二个
第二种:首先遍历第一个链表,找到表尾,然后去掉第二个链表的表头,把第二个链表的头部赋给第一个链表的尾部 //当然,如果没有表头什么的就直接把第一个节点赋给第一个就行了。
第二种方法之后,两个链表就合成一个了。
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函数的定义。
***
在C89中,main()是可以接受的。Brian *****和Dennis *****的经典巨著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 ***** 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语句了吧!不过,*****(Linux下的C编译器)会在生成的目标文件中加入return 0;。
用C语言实现两个线性链表的归并
以前学数据结构做过一个“非递减的链表合并一一个非递增的链表”
程序如下:
#include 《*****》
#include 《*****》
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;
}
更多文章:
bootstrap复杂表格(bootstrap table轻松实现数据表格)
2026年5月3日 01:00
while循环的作用(while(1)放在语句最后面有什么作用)
2026年5月3日 00:00
合并两个链表c语言(c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点)
2026年5月2日 23:40
卡通边框图片(手抄报简洁插画-珍爱生命预防溺水手抄报怎么画)
2026年5月2日 23:20
slice怎么用(safe slice mandoline 怎么用)
2026年5月2日 23:00





