首页 > 其他分享 >【数据结构/C语言】有序单链表L1、L2合并

【数据结构/C语言】有序单链表L1、L2合并

时间:2022-10-21 13:55:26浏览次数:90  
标签:int printf next LinkList L2 L1 C语言

1.根据输入的n和n个递增的有序数据建立一个带头结点的有序单链表L1,并输出有序链表中各元素值;
2.根据输入的m和m个递增的有序数据建立一个带头结点的有序单链表L2,并输出有序链表中各元素值;
3.将有序链表L1和L2合并到单链表L1中,要求使用原链中的结点,并使L1保持其原有序性,最后输出合并后的有序链表中各结点的元素值。


#pragma warning (disable:4996)
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct  LNode
{
    ElemType data;
    struct LNode* next;
} LNode, * LinkList;

Status L_Creat(LinkList& L, int n)
{
    LinkList r;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    r = L;
    printf("请输入各元素值:\n");
    for (int i = 0; i < n; i++)
    {
        LinkList p = (LinkList)malloc(sizeof(LNode));
        if (!p)
            return ERROR;
        scanf("%d", &p->data);
        p->next = NULL;
        r->next = p;
        r = p;
    }
    return OK;
}

Status L_Insert(LinkList& L, int i, ElemType e)
{
    LinkList p = L, s;
    int j = 0;
    while (p && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1)
        return ERROR;
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}
Status L_Delete(LinkList& L, int i, ElemType& e)
{
    LinkList p = L, q;
    int j = 0;
    while (p->next && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    if (!p->next || j > i - 1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}
Status L_Search(LinkList L, int i, ElemType& e)
{
    LinkList  p = L->next;
    int  j = 1;
    while (p && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p || j > i)
        return ERROR;
    e = p->data;
    return OK;
}

void L_Display(LinkList L)
{
    LinkList p = L->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
Status Merge(LinkList& L1, LinkList& L2)
{
    LinkList p = L1->next, q = L2->next, r;
    L1->next = NULL;
    r = L1;
    while (p && q)
    {
        if (p->data <= q->data)
        {
            r->next = p;
            r = p;
            p = p->next;
        }
        else
        {
            r->next = q;
            r = q;
            q = q->next;
        }
    }
    if (p)
        r->next = p;
    else
        r->next = q;
    free(L2);     
    return  OK;
}// Merge
int main()
//主函数 
{
    LinkList L;
    int n, i;
    ElemType x;
    printf("请输入链表长度:");
    scanf("%d", &n);
    L_Creat(L, n);
    printf("这个链表是:\n");
    L_Display(L);

    printf("请输入你想插入的位置:");
    scanf("%d", &i);
    printf("请输入你想要插入的元素:");
    scanf("%d", &x);
    L_Insert(L, i, x);
    printf("插入之后的链表是:");
    L_Display(L);

    printf("请输入你想删除的位置:");
    scanf("%d", &i);
    L_Delete(L, i, x);
    printf("删除的元素是:%d\n", x);
    printf("删除之后的链表是:");
    L_Display(L);

    printf("请输入待查找元素的位置:");
    scanf("%d", &i);
    if (L_Search(L, i, x))
        printf("第%d个元素是:%d\n", i, x);
    else
        printf("第%d个元素不存在\n", i);

    LinkList L1, L2;
    int a, b;
    printf("请输入L1的链表长度:");
    scanf("%d", &a);
    L_Creat(L1, a);
    printf("L1链表为:\n");
    L_Display(L1);
    printf("请输入L2的链表长度:");
    scanf("%d", &b);
    L_Creat(L2, b);
    printf("L2链表为:\n");
    L_Display(L2);
    if(Merge(L1, L2));
    printf("L1,L2合并后:");
    L_Display(L1);
    return 0;
}

标签:int,printf,next,LinkList,L2,L1,C语言
From: https://www.cnblogs.com/aal-izz-well-eureka/p/16813212.html

相关文章

  • C语言基本结构
    第一个C语言程序#include<stdio.h>main(){printf("Hello,World!\n");}保存文件为hello.c编译cchello.c运行./a.out如下➜clangcodecchello.......
  • 车充UL2089知识补充
    车充是一种类似于家庭用电的电源插座一样,通过插头接入​​汽车电源​​,然后引出多个插口的电子设备。车充对于经常使用汽车电子产品的车主非常有用。如用作手机充电,MP3/MP4......
  • C语言多路开关模式的switch语句
    C语言多路开关模式的switch语句将switch语句中有的语句块的break删除掉。使多个语句块输出同一个。例子:输入一个月份,判断是几月份。#define_CRT_SECURE_NO_WARNINGS1#incl......
  • C语言中的结构体——struct
    一.结构体概念结构体是C语言中很重要的知识点,结构体使得C语言有能力去描述复杂类型。    我们知道C语言中有许多类型,如:int、char、double······,但是现实世界......
  • C语言中的分支语句——if和switch语句
    一.什么是语句C语言中由一个分号‘;’隔开的就是一条语句。比如:    printf("haha\n");    1+2;再比如:    intmain()    {     ......
  • C语言循环语句——while、for、do while
    一.while循环    我们已经学会了if语句,当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。但是我们发现生活中很多的实际的例子是∶同......
  • 嵌入式-C语言基础:理解形参和实参的区别
    #include<stdio.h>//实参:函数原型中声明函数后面带的参数inttest(intx)//函数原型{//函数体printf("test里面的x地址=%p",&x);returnx;}//变量......
  • 嵌入式-C语言基础:二维数组
    #include<stdio.h>intmain(){intarray[2][3]={{1,2,3},{4,5,6}};for(inti=0;i<2;i++){for(intj=0;j<3;j++){prin......
  • 【C语言】结构体基础应用
    ......
  • 【C语言】第一个C语言程序代码分析
    在上一篇中我们已经创建了第一个C语言程序,接下来我们来分析一些此代码。1. #include<stdio.h>#include是C语言的预处理指令之一。在代码区域单独写出printf("hell......