题目要求
两个按元素值递增有序排列的线性表A,B。以单链表作存储结构,将表a与表b构造成元素值递减的表c,要求用到原地址空间
代码部分
#include "pch.h"
#include <iostream>
using namespace std;
#define datatype int
typedef struct node {
struct node* next;
datatype data;
}LNode,*linklist;
linklist init_linklist() {
LNode *p;
p = (LNode*)malloc(sizeof(LNode));
p->data = 0;
p->next = NULL;
return p;
}
void insert(LNode *head) {
datatype e;
LNode *p;
scanf_s("%d", &e);
while (e != 0)
{
p = (LNode*)malloc(sizeof(LNode));
p->data = e;
head->next=p;
head = p;
scanf_s("%d", &e);
}
head->next = NULL;
};
void merge(linklist &a, linklist &b, linklist &c) {
LNode *pa, *pb, *pc, *pre,*q;
pa = a->next;
pb = b->next;
pre = NULL;
while (pb&&pa)
{
if (pa->data > pb->data)
{
pc = pb;
q = pb->next;
pb->next = pre;
pb = q;
}
else
{
pc = pa;
q = pa->next;
pa->next = pre;
pa = q;
}
pre = pc;
}
while (pa)
{
pc = pa;
q = pa->next;
pa->next = pre;
pre = pc;
pa = q;
}
while (pb)
{
pc = pb;
q = pb->next;
pb->next = pre;
pre = pb;
pb = q;
}
c = a;
a->next = pc;
};
int main() {
linklist a, b,c;
a = init_linklist();
b = init_linklist();
c = init_linklist();
insert(a);
insert(b);
merge(a, b,c);
while (c != NULL)
{
printf("%d", c->data);
c = c->next;
}
return 0;
}
分析
从小到大依此将表a与表b插入新表头部pc处,最后通过构造新表头,实现链表逆置,处理a或b剩余元素