当前位置:首页 » 编程语言 » 两个链表合并为一个有序链表C语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

两个链表合并为一个有序链表C语言

发布时间: 2022-05-28 01:34:17

c语言链表合并:将两个有序单向链表合并为一个单向有序链表,要求分别用两种方式实现~急~求大神帮忙

小意思!有个前提,两个链表的数据类型都是一样的哦
第一种:先新建一个链表,然后遍历第一链表,同时把它的值都赋给新建的链表,然后,开始第二个链表,也是同样的办法。加上第二个的时候,先找到新建链表的表尾,再表尾处开始添加第二个
第二种:首先遍历第一个链表,找到表尾,然后去掉第二个链表的表头,把第二个链表的头部赋给第一个链表的尾部 //当然,如果没有表头什么的就直接把第一个节点赋给第一个就行了。

第二种方法之后,两个链表就合成一个了。

㈡ 如何用C语言把两个有序线性列表合并成一个有序线性链表(不超过10行的程序)

#include<stdio.h>
#include <malloc.h>
#include<limits.h>
#define MAX 1024
void merge(int a[],int p,int q,int b[],int r,int s,int c[])
{int i,j,n1,n2,n,k,m;
n1=q-p+1;
n2=s-r+1;
int *l=(int *)malloc(sizeof(int)*(n1+1));
for(i=0;i<n1;i++)
l[i]=a[p+i-1];

int *t=(int *)malloc(sizeof(int)*(n2+1)); for(j=0;j<n2;j++)
t[j]=b[r+j-1];

l[n1]=INT_MAX;t[n2]=INT_MAX;
i=0;
j=0;
for(k=0;k<n1+n2;k++)
{if(l[i]<t[j]){c[k]=l[i];
i++;}
else {c[k]=t[j];
j++;}}
for(i=0;i<n1+n2;i++)
printf("%d ",c[i]);
printf("\n");
}

int main()
{
int i;
int arr[] = {4,5,9,1000,1001};
int arr2[] = {1,7,8,999,1003,1005};
int *res = (int*)malloc(sizeof(int) * 100);
merge(arr,1,5,arr2,1,6,res);
return 0;

}

㈢ 有关c语言两个顺序链表的合并

typedefintElementType;
typedefstructNode*PtrToNode;//定义PtrToNode为指向Node的结构体指针
structNode{
ElementTypeData;
PtrToNodeNext;
};
typedefPtrToNodeList;//定义list为指向node结构体的指针

ListMerge(ListL1,ListL2){
Listpa=L1,pb=L2,head;
Listhead=pc=(structNode*)malloc(sizzeof(structNode));
pc=(pa->Data<=pb->Data)?pa:pb;//pc指向Data较小的节点
while(pa&&pb){//循环比较L1与L2两条链表的Data
if(pa->Data<pb->Data){
pc->Next=pa;
pc=pc->Next;
pa=pa->Next;
}
else{
pc->Next=pb;
pc=pc->Next;
pb=pb->Next;
}
}
while(pa){pc->Next=pa;pc=pc->Next;pa=pa->Next;}//将剩余的链表接到pc后面
while(pb){pc->Next=pb;pc=pc->Next;pb=pb->Next;}
printf("ListMergeisavailable!");
returnhead;
}

㈣ C语言编程题输入两个有序循环链表合成一个有序循环链表

有好几处错误和遗漏,帮你改了,你看下:

#include<stdio.h>
#include<stdlib.h>
#defineNULL0
structnode
{
intData;
structnode*next;
};
main()
{
structnode*p1,*q1,*head1;
structnode*p2,*q2,*head2;
structnode*p3,*q3,*head3;
intx,i;
p1=q1=head1=p2=q2=head2=p3=q3=head3=NULL;
scanf("%d",&x);
while(x!=-1)
{
p1=(structnode*)malloc(sizeof(structnode));
p1->Data=x;
if(q1==NULL)
{
q1=p1;
q1->next=NULL;
head1=p1;
}
if(q1!=NULL)
{
q1->next=p1;
q1=p1;
}
scanf("%d",&x);
}
p1->next=NULL;
scanf("%d",&i);
while(i!=-1)
{
p2=(structnode*)malloc(sizeof(structnode));
p2->Data=i;
if(q2==NULL)
{
q2=p2;
q2->next=NULL;
head2=p2;
}
if(q2!=NULL)
{
q2->next=p2;
q2=p2;
}
scanf("%d",&i);
}

p2->next=NULL;

p1=head1;
p2=head2;
p3=(structnode*)malloc(sizeof(structnode));
q3=head3=p3;
while(p1!=NULL&&p2!=NULL)
{
if(p1->Data<p2->Data)
{
//q3->Data=p1->Data;
q3->next=p1;
q3=p1;
p1=p1->next;
}
else
{
//q3->Data=p2->Data;
q3->next=p2;
q3=p2;
p2=p2->next;
}
if(p1==NULL)
q3->next=p2;
if(p2==NULL)
q3->next=p1;

}
if(q3!=NULL)q3->next=NULL;
p3=head3->next;
while(p3!=NULL)
{
printf("%d",p3->Data);
p3=p3->next;
}
}

㈤ c++将两个有序链表合并为一个有序链表

#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

class Node
{
public:
Node()
{
next=NULL;
}
Node(int d):data(d)
{
next=NULL;
}
~Node()
{
if(next)
delete next;
}
int data;
Node *next;
};

class List
{
public:
List()
{
first=NULL;
}
~List()
{
delete first;
cout<<endl;
}
void InitList(int len,int min,int max)
{
int i,data;
Node *tail,*pnew;

data=rand()%(max-min+1)+min;
this->first=tail=new Node(data);
for(i=1;i<len;i++)
{
data=rand()%(max-min+1)+min;
pnew=new Node(data);
tail->next=pnew;
tail=pnew;
}
}
void OutputList() const
{
Node *p=first;

while(p)
{
cout<<p->data;
cout<<(p->next ? "->" : "\n");
p=p->next;
}
}
Node *first;
};

//将数组lists中的len个链表合并到lst中
//asc为true按升序合并,false按降序合并
//不要求lists中的各链表是有序的
//合并后,不会改变lists中的各原链表
void MergeList(List &lst,bool asc,List lists[],int len)
{
int i;
Node *p,*q,*pnext,*pnew=NULL;

lst.first=NULL;
for(i=0;i<len;i++)
{
pnext=lists[i].first;
while(pnext)
{
pnew=new Node();
pnew->next=NULL;
pnew->data=pnext->data;
if(!lst.first)
lst.first=pnew;
else
{
q=NULL;
p=lst.first;
while(p)
{
if((asc && pnew->data<p->data)||
(!asc && pnew->data>p->data))
{
pnew->next=p;
if(!q)
lst.first=pnew;
else
q->next=pnew;
break;
}
q=p;
p=p->next;
}
if(!p)
q->next=pnew;

}
pnext=pnext->next;
}
}
}

int main()
{
//链表节点可取的最小值,最大值,最小链表节点数量,最大链表节点数量
int const MinValue=1,MaxValue=1000,MinLen=2,MaxLen=25;
//最小链表数量,最大链表数量
int const MinListCount=2,MaxListCount=8;
List lst1,lst2,*lists;
int i,c,len;

srand(time(NULL));
c=rand()%(MaxListCount-MinListCount+1)+MinListCount;
lists=new List[c];
cout<<"合并前,各链表:"<<endl;
for(i=0;i<c;i++)
{
len=rand()%(MaxLen-MinLen+1)+MinLen;
lists[i].InitList(len,MinValue,MaxValue);
cout<<"list "<<(i+1)<<endl;
lists[i].OutputList();
}
cout<<endl<<endl;
MergeList(lst1,true,lists,c);
MergeList(lst2,false,lists,c);
cout<<"合并后,各链表(不变):"<<endl;
for(i=0;i<c;i++)
{
cout<<"list "<<(i+1)<<":"<<endl;
lists[i].OutputList();
}
cout<<endl<<endl;
cout<<"按升序合并后:"<<endl;
lst1.OutputList();
cout<<"按降序合并后:"<<endl;
lst2.OutputList();
delete [] lists;
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语言,如何使两个链表合并,求解答

void test(LNodeL *head1,Node *head2)//将表头为head2的链表合并到head1
{
LNode *p1 = head1;
while(p1->next != NULL)
{
p1 = p1->next;
}
p->next = head2;
}
这样就可以。

㈨ 请用算法写出两个有序表合并成一个有序线性表(用C语言

#include "stdio.h" main() { int a,b,c,i,j,k,low,high,mid; int la[50]; int lb[50]; int lc[50]; printf("Please input the width of la,lb,lc:\n"); printf("Input here:"); scanf("%d,%d,%d",&a,&b,&c); printf("a=%d,b=%d,c=%d\n",a,b,c); if (a+b>c) printf("lc overflow,operation halt!\n"); else { printf("Input la:"); for(i=1;i<=a;++i) { scanf("%d",&la[i]); la[0]=la[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(la[0]=low;j--) la[j+1]=la[j]; la[low]=la[0]; } printf("\n"); printf("Input lb:"); for(i=1;i<=b;++i) { scanf("%d",&lb[i]); lb[0]=lb[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(lb[0]=low;j--) lb[j+1]=lb[j]; lb[low]=lb[0]; } printf("\n"); printf("la is:"); for (i=1;i<=a;i++) printf("%d ",la[i]); printf("\n"); printf("lb is:"); for (j=1;j<=b;j++) printf("%d ",lb[j]); i=1;j=1;k=0; while (i<=a && j<=b) if (la[i]>lb[j]) { lc[k]=lb[j];k++;j++;} else { lc[k]=la[i];k++;i++;} while (i<=a) {lc[k]=la[i];k++;i++;} while (j<=b) {lc[k]=lb[j];k++;j++;} printf("\n"); printf("lc is:"); for (i=0;i } getch(); } 把la,lb,lc分别换一下就OK了

希望采纳