合并两个链表c语言(c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点)

:暂无数据 2026-05-02 23:40:01 0
本篇关于合并两个链表c语言的讲解,将摒弃陈词滥调,直击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;
}

合并两个链表c语言不是孤立的,c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点也是如此。建议你结合我们之前关于[相关主题A]和[相关主题B]的文章一起阅读,效果更佳。
本文编辑:admin

更多文章:


表单控件怎么删除(vba用代码删除控件怎么删除)

表单控件怎么删除(vba用代码删除控件怎么删除)

大家好,今天小编来为大家解答以下的问题,关于表单控件怎么删除,vba用代码删除控件怎么删除这个很多人还不知道,现在让我们一起来看看吧!

2026年5月3日 01:20

bootstrap复杂表格(bootstrap table轻松实现数据表格)

bootstrap复杂表格(bootstrap table轻松实现数据表格)

“bootstrap复杂表格”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看bootstrap复杂表格(bootstrap table轻松实现数据表格)!

2026年5月3日 01:00

系统架构流程图(系统架构五横三纵图怎么画)

系统架构流程图(系统架构五横三纵图怎么画)

相信点开这篇文章的你,一定对系统架构流程图抱有好奇。没关系,下面我们就结合系统架构五横三纵图怎么画,带你一步步揭开它的面纱。

2026年5月3日 00:40

计算机冒泡排序算法(py冒泡法排序)

计算机冒泡排序算法(py冒泡法排序)

有没有觉得计算机冒泡排序算法听起来很高深?别怕,今天我们就把它和py冒泡法排序一起,拆解成易懂的小知识点。

2026年5月3日 00:20

while循环的作用(while(1)放在语句最后面有什么作用)

while循环的作用(while(1)放在语句最后面有什么作用)

其实while循环的作用的问题并不复杂,但是又很多的朋友都不太了解while(1)放在语句最后面有什么作用,因此呢,今天小编就来为大家分享while循环的作用的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年5月3日 00:00

合并两个链表c语言(c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点)

合并两个链表c语言(c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点)

本篇关于合并两个链表c语言的讲解,将摒弃陈词滥调,直击c语言 两个线性链表合并并且从小到大排列,检验没错但运行不能,求指点这一实战要害,给你可即刻应用的策略。

2026年5月2日 23:40

卡通边框图片(手抄报简洁插画-珍爱生命预防溺水手抄报怎么画)

卡通边框图片(手抄报简洁插画-珍爱生命预防溺水手抄报怎么画)

我们整理了关于卡通边框图片最高频的提问,发现手抄报简洁插画-珍爱生命预防溺水手抄报怎么画位列榜首。于是,就有了这篇集中解答的精华帖。

2026年5月2日 23:20

slice怎么用(safe slice mandoline 怎么用)

slice怎么用(safe slice mandoline 怎么用)

是不是总觉得slice怎么用的知识体系太庞大,safe slice mandoline 怎么用更是无从下手?本文将帮你化繁为简,抓住核心。

2026年5月2日 23:00

被人碰瓷怎么办(遇到碰瓷怎么办)

被人碰瓷怎么办(遇到碰瓷怎么办)

上一篇文章我们介绍了被人碰瓷怎么办的基础,今天我们将深入其核心环节——遇到碰瓷怎么办,看看它如何承前启后。

2026年5月2日 22:40

模块英文?模块化, 英文怎么说

模块英文?模块化, 英文怎么说

今天这份关于模块的英文的指南,将用80%的篇幅讲透模块英文这个决定成败的细节,绝对让你不虚此行。

2026年5月2日 22:20

最近更新

bootstrap复杂表格(bootstrap table轻松实现数据表格)
2026-05-03 01:00:02 浏览:0
slice怎么用(safe slice mandoline 怎么用)
2026-05-02 23:00:03 浏览:0
被人碰瓷怎么办(遇到碰瓷怎么办)
2026-05-02 22:40:03 浏览:0
模块英文?模块化, 英文怎么说
2026-05-02 22:20:02 浏览:0
热门文章

split函数 sql(求sql split函数的用法)
2026-03-26 20:40:01 浏览:1
mysql insert into字段顺序问题(mysql insert into的问题)
2026-04-13 16:00:02 浏览:1
标签列表