数据结构(C语言) 单链表的合并(100分)

2025-03-11 14:04:09
推荐回答(3个)
回答1:

#include
#include
#include

struct LNode
{
int data;
struct LNode *next;
};

typedef LNode* LinkList;

Linklist *unio(Linklist *p,Linklist *q) //合并
{
linklist *R,*pa,*qa,*ra;
pa=p;
qa=q;
R=ra=p;
while(pa->next!=NULL&&qa->next!=NULL)
{
if(pa->data>qa->data)
{
ra->next=qa;
qa=qa->next;
}
else
{
ra->next=pa;
pa=pa->next;
}
}
if(pa->next!=NULL)
ra->next=pa;
if(qa->next!=NULL)
ra->next==qa;
return R;
}
void CreateList_L(LinkList &L, int n)
{ // 算法2.11
// 逆位序输入(随机产生)n个元素的值,建立带表头结点的单链线性表L
LinkList p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; // 先建立一个带头结点的单链表
for (i=n; i>0; --i)
{
p = (LinkList)malloc(sizeof(LNode)); // 生成新结点
p->data = rand() % 200; // 改为一个随机生成的数字(200以内)
p->next = L->next;
L->next = p; // 插入到表头
}
} // CreateList_L

void main()
{
LinkList pHead; //定义两个链表
LinkList qHead;
int num;
printf("输入要创建的链表长度num\n");
scanf("d%",&num);
CreateList_L(pHead,num);
CreateList_L(qHead,num);

LinkList p=pHead->next;
LinkList q=qHead->next;
while(p!=NULL) //下面是输出两个链表
{
printf("%d\n",p->data);
p=p->next;
}
while(q!=NULL)
{
printf("%d\n",q->data);
q=q->next;
}

//上面创建完后,下面合并并输出
LinkList unioHead;
unioHead unio(&pHead,&qHead); //合并
LinkList myunio = unioHead ->next;
while(myunio!=NULL) //输出
{
printf("%d\n",myunio->data);
myunio=myunio->next;
}
}

回答2:

#include
#include
#include

typedef struct list
{
long value;
struct list * next;
}list;

void CreatList(list * p,int length)
{
int i,value;
list *r,*s;
for(i=0;i {
value=rand();
r=p;
while(1)
{
if(r->next==NULL)
{ r->next=(list*)malloc(sizeof(list));
r->next->next=NULL;
r->next->value=value;
break;
}
else
{
if(value <= r->next->value)
{
s=r->next;
r->next=(list*)malloc(sizeof(list));
r->next->next=s;
r->next->value=value;
break;
}
else r=r->next;
}
}
}
}
void ShowList(list * p)
{
p=p->next;
while(p)
{
printf("%d ",p->value);
p=p->next;
}
printf("\n");
}
void MerList(list * p[])
{
list *p0=p[0],*p1=p[1]->next,*r,*q;
while(p0->next)
{
while(p1->value >= p0->next->value)
{
p0=p0->next;
if(p0->next==NULL){p0->next=p1;return;}
}
r=p1;
if(r)
{
q=r;
while(r->value<= p0->next->value)
{
if(r->next==NULL){p0->next=p1;return;}
q=r;
r=r->next;
}
r=q;
q=p0->next;
p0->next=p1;
p1=r->next;
r->next=q;
p0=r;
r=p1;
}
}
if(p1)
p0->next=p1;
}
int main()
{
int i,length;
list *p[]={NULL,NULL};
srand(time(NULL));
for(i=0;i<2;i++)
{
printf("\ninput the length of No.%d list:",i+1);
scanf("%d",&length);
p[i]=(list*)malloc(sizeof(list));
p[i]->next=NULL;
CreatList(p[i],length);
printf("\nthe No.%d list is: ",i+1);
ShowList(p[i]);
}
MerList(p);
printf("\nafter Merge:\n");
ShowList(p[0]);
getchar();
return 0;
}

回答3:

楼上的没有对单链表分别排序,并且两个链表的长度不一定相同,而楼主却设定两个链表长度相同。