#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 0
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(OVERFLOW);
L->next = NULL;
return OK;
}
Status CreateList(LinkList L,int n) //头插法
{
LinkList p,q;
p = L;//第一步,取到头结点,两个指针指向同一内存,改变p指向的内存,L指向的内存不变,L仍为头结点
printf("请输入%d个数:\n", n);
for (int i = 1; i <= n; i++)
{
q = (LinkList)malloc(sizeof(LNode));
if (!p)
{
printf("p的初始化出现问题!\n");
return ERROR;
}
scanf_s("%d", &q->data);
q->next = p->next;//第二步链接两个结点
p->next = q;//第二步链接两个结点
p = q;//关键的一步,更换位置,进行下次循环
}
return TRUE;
}
Status DestoryList(LinkList L) //回收链表(free每个节点都需要回收,头结点不用回收)
{
if (!L->next)
{
printf("链表的值本来就是空的!\n");
return ERROR;
}
LinkList q,p;
q = L->next;
while (q)
{
p = q->next;
free(q);
q = p;
}
return TRUE;
}
Status InsertList(LinkList L, int i, ElemType data) //插入
{
//判断i值是否合法,i<1||i>表长---(注意方法是!p||j>i如果这两种不可能的情况发生,则i值不合法)
//j>i用来判断i<1,!p用来判断p是NULL.而且是两者有一个成立就返回
//注意判断摆放的位置,在循环找i值对应的元素之后
LinkList p;
int j = 0;
p = L;
//寻找第i-1个节点
while (p&&j < i - 1) {
p = p->next;
j++;
}
if (!p || j >= i) {
printf("传入插入函数的i值不合法\n");
return ERROR;
}
LinkList q;
q = (LinkList)malloc(sizeof(LNode));
q->data = data;
q->next = p->next;
p->next = q;
return TRUE;
}
Status GetLinkList(LinkList L) //顺序输出这个链表
{
if (!L->next)
{
printf("链表没有节点,不能输出!\n");
return ERROR;
}
LinkList p;
p = L->next;
while (p)
{
printf("%d", p->data);
p = p->next;
}
return TRUE;
}
Status MergeList_L(LinkList &La,LinkList&Lb,LinkList &Lc)//合并两个顺序表
{
LinkList pa,pb,pc;
pa = La->next;
pb = Lb->next;
Lc = pc =La; //将La的头结点作为Lc的头结点
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
if(pa)
{
pc->next = pa;
}
if(pb)
{
pc->next = pb;
}
}
return TRUE;
}
int main()
{
LinkList L1,L2,L3;
int n,m;
InitList(L1);
InitList(L2);
printf("表1.请输入数据的个数:");
scanf("%d",&m);
CreateList(L1,m);
printf("表2.请输入数据的个数:");
scanf("%d",&n);
CreateList(L2,n);
GetLinkList(L1);
printf("\n");
GetLinkList(L2);
printf("\n");
printf("两表合并后为:\n");
MergeList_L(L1,L2,L3);
GetLinkList(L3);
return 0;
}
线性链表两表的合并
最新推荐文章于 2023-03-12 16:54:56 发布