📄 1.cpp
字号:
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
struct LNode* creat_List(int n)
{//输入n个元素值,建立带头结点的单链循环表l
struct LNode *p,*l;
int i;
l=(struct LNode*)malloc(sizeof(LNode));//建立头结点
printf("请输入数据(从大到小):\n");
for(i=1;i<=n;i++)
{
p=(struct LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
if(i==1)
p->next=l;//如果i=1,直接构成循环链表
else
p->next=l->next;
l->next=p;//从后往前依次插入数据,建立循环链表
}
return(l);//返回l
}
struct LNode *reverse_List(struct LNode *l1,struct LNode *l2)
{//归并l1,l2两顺序存储数据链表为表l,l内数据顺序不变
struct LNode *pa,*pb,*pc;
pc=l1;
pa=l1->next;
pb=l2->next;
while(pa!=l1&&pb!=l2)//判断是否有一个表已经连接完毕
{
if(pa->data>=pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
}
pc->next=pa!=l1?pa:pb;//插入剩余段
while(pc->next!=l2&&pc->next!=l1)
pc=pc->next;
pc->next=l1;
free(l2);//释放l2
return(l1);
}
void printf_List(struct LNode *l)
{//输出链表
struct LNode *p;
p=l->next;
while(p!=l)//输出直到下一节点是头结点
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");//使界面整洁
}
void main()
{
struct LNode *list1,*list2,*l;
int n;
printf("归并两个链表演示程序:\n");
printf("输入链表一的长度:");
scanf("%d",&n);//输入链表一的长度
if(n<1)
{
printf("error\n");
return;
}
list1=creat_List(n);//建立长为n的链表一
printf("输入链表二的长度:");
scanf("%d",&n);//输入链表二的长度
if(n<1)
{
printf("error\n");
return;
}
list2=creat_List(n);//建立长为n的链表二
l=reverse_List(list1,list2);//归并表一表二
printf("归并后的表为:\n");
printf_List(l);//输出归并后的表
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -