大概思路:1.先写出建立链表的函数(creatlist):分配头节点,尾指针置空。
2.写出插入节点的代码函数:申请一片空间存放要插入的节点,把新插入的节点置空,令指向链表的头节点的下一个指针指向该节点,在把该指针指向新插入的节点。用if函数写出当输入的指小于零时跳出,(可自定义任何数,此处我选择小于零)。
3.写出用循环思想输出链表的每个节点的函数
4.第四步也是最重要的一步,合并链表,定义三个指针,其中有一个中间指针pre,另外两个指针分别指向两个链表的头节点,将要合并到的链表指向其中一个链表,为了满足题目中不占用其他存储空间的要求,再用while和if循环比较,pa->data <= pb->data时,令中间指针pre指向pa下一个结点,pa下一个结点指向La下一个结点,即置空,再把pa连起来,然后pa指针后移。反之同理。
5.当两个链表长度不一样时,我们需要处理剩下的数据,此时只需把剩下的数据接到我们排好的链表之后就可以。
6.接下来在主函数main中运用我们定义的函数就完成了。
#include <stdio.h>
#include <iostream>
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*Linklist;
//建立一个链表并输入结点的值
void creatlist(Linklist &L) {
Linklist p, q;
L = (Linklist)malloc(sizeof(LNode));//分配一个头节点
L->next = NULL;
q = L;
p = L;
while (L) {//新增并插入一个结点
q = (Linklist)malloc(sizeof(LNode));//分配一个结点
q->next = NULL;
printf("输入结点的值:\n");
scanf_s("%d", &q->data);
if (q->data < 0)
break;
p->next = q;
p = q;
}
}
//输出链表
void print(Linklist &L) {
Linklist p;
p = L->next;
while (p) {
printf("%d ", p -> data);
p = p->next;
}
}
//合并链表
void integratelist(Linklist& La, Linklist& Lb, Linklist& L) {
Linklist pa, pb, pre;
pa = La->next;
pb = Lb->next;
L = La;
La->next = NULL;//链表置空
while (pa && pb) {
if (pa->data <= pb->data) {
pre = pa->next;//中间指针指向pa下一个结点
pa->next=La->next;//pa下一个结点指向La下一个结点,即置空
La->next=pa;//链接pa
pa=pre;
}
else{
pre = pb->next;
pb->next = La->next;
La->next = pb;
pb = pre;
}
}
if (pa)//处理pa剩余的部分
pb = pa;
while (pb) {//处理pb剩余的部分
pre = pb->next;
pb->next = La->next;
La->next = pb;
pb = pre;
}
free(Lb);
}
int main() {
Linklist La, Lb, L;
creatlist(La);
creatlist(Lb);
integratelist(La, Lb, L);
print(L);
return 0;
}
下面是运行的结果文章来源:https://www.toymoban.com/news/detail-745437.html
文章来源地址https://www.toymoban.com/news/detail-745437.html
到了这里,关于数据结构2.2,将两个非递减的有序链表合并为一个非递增的有序链表,要求结果链表仍使用原来两个链表的存储空间,不占用其他的存储空间。表中允许有重复的数据。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!