线性链表两表的合并

#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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值