数据结构——链表的基本操作

本文介绍了一个使用C语言实现的单链表基本操作集合,包括链表的创建、遍历、长度计算、逆置等,并提供了创建有序链表及合并多个有序链表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

怎么说呢? 这个代码是好久之前学链表时写的,在codeblocks上编译通过了,以前测试过了,现在没测试就直接复制到上面,有什么问题欢迎指正,O(∩_∩)O谢谢

具体代码如下:


#include<bits/stdc++.h>
#define N 1009
using namespace std;


typedef struct Node
{
    int  data;
    struct Node *next;
}Lnode, *LinkList;



void menu()
{
    printf("\t\t\t   单链表基本操作\n\n");
    printf("\t\t\t1.建  立  单  链  表\n");
    printf("\t\t\t2.遍  历  单  链  表\n");
    printf("\t\t\t3.计  算  链 表 长 度\n");
    printf("\t\t\t4.链  表  逆  置\n");
    printf("\t\t\t5.删  除  偶 数 节 点\n");
    printf("\t\t\t6.生 成 值 有 序 单 链 表\n");
    printf("\t\t\t7.合  并 生 成 降  序  链 表\n");
    printf("\t\t\t8.合  并 生 成 升  序  链 表\n");
    printf("\t\t\t9.分  解  链  表\n");
    printf("\t\t\t0.退          出\n\n");
}

/*初始化空表*/
bool Init_Linklist(LinkList &L)
{
    L=(LinkList)malloc(sizeof(Lnode));
    if(!L) return false;
    L->next=NULL;
    return true;
}

/*尾插法建立单链表*/
bool Creat_Linklist(LinkList &L)
{
    int x;
    LinkList p,rear;
    Init_Linklist(L);
    rear = L;
    printf("输入-1表示输入结束\n");
    while(scanf("%d",&x),x != -1)
    {
        p = (LinkList)malloc(sizeof(Lnode));
        if(!p) return false;
        p->data = x;
        rear->next = p;
        rear = p;
    }
    rear->next = NULL;
    return true;
}

/*单链表遍历*/
void Disp_Linklist(LinkList L)
{
    LinkList p;
    p = L->next;
    while(p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

/*计算单链表长度*/
int length_Linklist(LinkList L)
{
    int count = 0;   /*count表示单链表长度*/
    LinkList p;
    p = L->next;
    while(p)
    {
        count++;
        p = p->next;
    }
    return count;
}

/*单链表逆置*/
void Reverse_Linklist(LinkList L)
{
    LinkList p, q, tm;
    p = L->next;
    q = p->next;
    if(!q) return ;
    p->next = NULL;
    while(q)
    {
        tm = q->next;
        q->next = p;
        p = q;
        if(!tm) break;
        q = tm;
    }
    L->next = q;
}

/*删除值为偶数的结点*/
void DelEven_Linklist(LinkList L)
{
    LinkList p, q;
    p = L;
    q = p->next;
    while(q)
    {
        if(!(q->data&1))
        {
            p->next = q->next;
            free(q);
            q = p->next;
            continue;
        }
        p = q;
        q = q->next;
    }

}

/*在有序单链表中插入元素,链表仍然有序,插入成功返回true,插入失败返回false*/
bool Insert_Linklist(LinkList L, int x)
{

    LinkList p, q;
    p = L;
    q = p->next;
    while(q)
    {
        if(q->data > x)
        {
            LinkList s = (LinkList)malloc(sizeof(Lnode));
            s->data = x;
            s->next = q;
            p->next = s;
            return true;
        }
        p = q;
        q = q->next;
    }
    LinkList s = (LinkList)malloc(sizeof(Lnode));
    s->data = x;
    s->next = NULL;
    p->next = s;
    return true;
}

/*创建非递减有序单链表,创建成功返回true,创建失败返回false*/
bool CreatOrder_Linklist(LinkList &L)
{
    int x;
    printf("请输入有序链表,以文件尾结尾\n");
    Init_Linklist(L);
    while(~scanf("%d", &x))	Insert_Linklist(L, x);
    return true;
}


/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/
void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
    LinkList a, b, c, cur;
    a = La->next;
    b = Lb->next;
    c = Lc = La;
    c->next = NULL;
    while(a&&b)
    {
        if(a->data > b->data)
        {
            cur = b->next;
            b->next = c->next;
            c->next = b;
            b = cur;
            continue;
        }
        cur = a->next;
        a->next = c->next;
        c->next = a;
        a = cur;
    }
    while(a)
    {
        cur = a->next;
        a->next = c->next;
        c->next = a;
        a = cur;
    }
    while(b)
    {
        cur = b->next;
        b->next = c->next;
        c->next = b;
        b = cur;

    }

}


/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
    LinkList pa, pb, pc;
    pa = La->next;
    pb = Lb->next;
    pc = Lc = La;
    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;
        }
    }
    pc->next = pa ? pa : pb;
    free(Lb);
}

/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
void Split_Linklist(LinkList La, LinkList &Lb)
{
    LinkList p, q, b;
    p = La;
    q = p->next;
    b = Lb = La;
    while(q)
    {
        if(q->data&1) continue;
        b->next = q;
        b = q;
        p->next = q->next;
        q = q->next;
    }
}



int main()
{
    int choice, length;
    LinkList L, La, Lb, Lc;
    while(1)
    {
        menu();
        printf("选择你的操作:");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            if(Creat_Linklist(L))
                printf("单链表创建成功\n");
            else
                printf("单链表创建失败\n");
            break;
        case 2:
            Disp_Linklist(L);
            break;
        case 3:
            length = length_Linklist(L);
            printf("单链表长度为:%d\n",length);
            break;
        case 4:
            Reverse_Linklist(L);
            printf("逆置后的链表为:\n");
            Disp_Linklist(L);
            break;
        case 5:
            DelEven_Linklist(L);
            printf("新链表为:\n");
            Disp_Linklist(L);
            break;
        case 6:
            if(CreatOrder_Linklist(L))
            {
                printf("值有序链表为:\n");
                Disp_Linklist(L);
            }
            else
                printf("单链表创建失败\n");
            break;
        case 7:
            CreatOrder_Linklist(La);
            CreatOrder_Linklist(Lb);
            MergeDescend_Linklist(La, Lb, Lc);
            printf("合并后的新链表为:\n");
            Disp_Linklist(Lc);
            break;
        case 8:
            CreatOrder_Linklist(La);
            CreatOrder_Linklist(Lb);
            MergeAscend_Linklist(La, Lb, Lc);
            printf("合并后的新链表为:\n");
            Disp_Linklist(Lc);
            break;
        case 9:
            Creat_Linklist(L);
            Split_Linklist(L, Lb);
            printf("分裂后的新链表为:\n");
            Disp_Linklist(L);
            Disp_Linklist(Lb);
            break;
        case 0:
            return 0;
        default:
            printf("输入错误,请重新输入\n");
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值