c语言:链表的基本操作

这篇博客详细介绍了C语言中链表的基本操作,包括链表节点的插入、使用冒泡排序进行排序、删除节点以及编辑操作。作者提到,虽然这标志着C语言学习的一段收尾,但不涉及文件处理、二级指针和行指针等内容。由于注释不够充分,作者计划在未来改进代码以增加可读性。

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

说明:c语言的一个收尾之作,对链表的处理包括插入,排序(冒泡排序),删除,编辑,本应该早就写的这个因种种原因拖到现在才写完
ps:这个收尾不包括文件处理二级指针以及行指针,学习c不会停;

#include<stdio.h>
#include<string.h>
#define NULLL 0
typedef struct lb
{
    char name[20],number[20];
    struct lb *next;
}LB;
void in(LB* head);
char begin();
void delete(LB* head);
void lookfor(LB* head);
void sort(LB* head);
void edit(LB* head);
LB* inend,lookforend;
main()
{
    char judge;
    printf("*******************************************\n");
    printf("*                                         *\n");
    printf("*          这是一个链表处理程序           *\n");    
    printf("*                                         *\n");
    printf("*******************************************\n");
    LB head={"name","number",NULL};
    head.next=(LB *)malloc(sizeof(LB));
    inend=head.next;
    printf("******链表初始化请输入第一个数据元素*******\n");
    printf("格式如number name\n");
    scanf("%s %s",inend->number,inend->name);//初始化建立一个链表头,和链表指针方便插入
    while(1)
    {
        judge=begin();
        if(judge<'1'||judge>'5')
        printf("********该功能数字无效请重新输入****\n\n");
        switch (judge)
        {
            case '1':in(head.next);break;
            case '2':delete(&head);break;
            case '3':sort(&head);break;
            case '4':lookfor(&head);break;
            case '5':edit(head.next);break;
        }
    }
}
char begin()
{
    printf("******************主菜单*******************\n");
    printf("1.插入数据元素       2.删除数据元素       *\n");
    printf("3.排序数据元素       4.查看已有全部元素   *\n");
    printf("5.修改已存在的数据元素                    *\n");
    printf("******输入对应的功能数字进行相关操作*******\n");
    char r;
    fflush(stdin);
    scanf("%c",&r);
    return r;
}
void in(LB *head)
{//输入一个新的数据元素默认放在链表底端
    char judge='y';
    LB * temporary;
    while(judge=='y'||judge=='Y')
    {
        temporary=(LB *)malloc(sizeof(LB));
        inend->next=temporary;
        inend=temporary;
        printf("***********请输入想要添加的数据元素********\n");
        scanf("%s %s",temporary->number,temporary->name);
        printf("*******是否想要继续添加其他的数据元素******\n");
        printf("*******是(y\\Y)\\否(任意键并退回主菜单)******\n");
        fflush(stdin);
        scanf("%c",&judge);
    }
    inend->next=NULL;
}
void delete(LB *head)
{//删除功能函数:选择查找的方式,找到要删除的结点并释放该结点的空间,以保证流畅
    int judgedelete=0;
    char wantdelete[20];
    LB *p=0,*deletep=head;
    char judge='0',judge1;
    while(1)
    {
        judgedelete=1;
        printf("**************进入删除操作菜单*************\n");
        printf("1.通过number删除    2.通过name删除        *\n");
        printf("3.退出删除返回主菜单                      *\n");
        printf("*******************************************\n");
        fflush(stdin);
        scanf("%c",&judge);//根据输入的名字还是编号进行删除
        if(judge=='3') break;
        rein:;
        switch(judge)
        {
            case '1':
            {
                judgedelete=0;
                p=head;
                printf("*******请输入想要删除数据元素的number******\n");
                char deletenumber[20];
                fflush(stdin);
                scanf("%s",deletenumber);
            while(p)
            {
                if(strcmp(p->number,deletenumber)==0)
                {
                    judgedelete++;
                    if(p->next==0)
                    {
                        free(p);
                        deletep->next=NULL;
                        inend=deletep;
                    }
                    else
                    {                        
                        deletep->next=p->next;
                        free(p);
                        p=deletep;  
                    }
                }
                if(judgedelete==0)
                deletep=p;
                p=p->next;
            }break;
            }
            case '2':
            {
                judgedelete=0;
                p=head;
                printf("*******请输入想要删除数据元素的name********\n");
                char deletename[20];
                fflush(stdin);
                scanf("%s",deletename);
                while(p)
                {
                    if(strcmp(p->name,deletename)==0)
                    {
                        judgedelete++;
                        if(p->next==0)
                        {
                            free(p);
                            deletep->next=NULL;
                            inend=deletep;
                        }
                        else
                        {                        
                            deletep->next=p->next;
                            free(p);
                            p=deletep;  
                        }
                    }
                    if(judgedelete==0)
                    deletep=p;
                    p=p->next;
                }
            }break;
            default :
            printf("*****输入的删除功能编号有误请重新输入******\n");break;
        }
        if(judgedelete==0)
            {
                printf("*******未找到输入的信息,是(y\\Y)否重新输入****\n");
                fflush(stdin);
                if((judge1=getchar())=='y'||judge1=='Y')
                goto rein; 
            }
        else if(judge=='1'||judge=='2')
            printf("**********删除成功返回删除主菜单***********\n");
    }
}
void sort(LB *head)
{//可以选择排序方式,采用冒泡排序的方法对链表进行排序
    char  sortjudge;
    LB* p=head->next,*sort1=p;
    LB temporary,* t1,* t2,* endsort,* endsortjudge=inend;
    printf("*  1.通过number排序      2.通过name排序   *\n");
    fflush(stdin);
    scanf("%c",&sortjudge);
    switch(sortjudge)
    {
        case '1':
        {
            for(p=head->next;p;p=p->next)
            {
                endsort=endsortjudge;
                for(sort1=head->next;sort1!=endsort;sort1=sort1->next)
                    if(strcmp(sort1->number,sort1->next->number)>0)
                    {
                        t1=sort1->next;
                        t2=sort1->next->next;
                        temporary=*sort1;
                        *sort1=*(sort1->next);
                        sort1->next=t1;
                        *(sort1->next)=temporary;
                        sort1->next->next=t2;
                    }
                endsortjudge=sort1;
            }
            printf("******************排序成功*****************\n");
        }break;
        case '2':
        {
            for(p=head->next;p;p=p->next)
            {
                endsort=endsortjudge;
                for(sort1=head->next;sort1!=endsort;sort1=sort1->next)
                    if(strcmp(sort1->name,sort1->next->name)>0)
                    {
                        t1=sort1->next;
                        t2=sort1->next->next;
                        temporary=*sort1;
                        *sort1=*(sort1->next);
                        sort1->next=t1;
                        *(sort1->next)=temporary;
                        sort1->next->next=t2;
                    }
                endsortjudge=sort1;
            }
            printf("******************排序成功*****************\n");
        }break;
        default:
        printf("********输入的排序方式有误是否重新输入*****\n");
        printf("******如果是请输入y/Y否的话请输入任意******\n");
        fflush(stdin);
        if((sortjudge=getchar())=='y'||sortjudge=='Y')
            sort(head);
    }
}
void edit(LB *head)
{
    char nameedit[20],numberedit[20],judge1;
    int judgegn=0;
    LB * headp=head;
            printf("1.通过number查找编辑                      *\n2.通过name查找编辑                        *\n");
    fflush(stdin);
    scanf("%d",&judgegn);
    if(judgegn!=1&&judgegn!=2)
    {
        printf("***输入的查找方式有误是(Y)否(n)重新输入***\n");
        fflush(stdin);
        scanf("%d",&judgegn);
        if(judgegn=='y'||judgegn=='Y')
        edit(head);
    }
    else
    {
        switch(judgegn)
        {
        case 1:
        {
            printf("*********请输入想要查找的number************\n");
            fflush(stdin);
            scanf("%s",numberedit);
            while(headp)
            {
                if(strcmp(numberedit,headp->number)==0)
                {
                    printf("***********已找到相应的数据元素************\n");
                    printf("****是(y/Y)否(输入任意)更改对应的number****\n");
                    fflush(stdin);
                    scanf("%c",&judge1);
                    if(judge1=='Y'||judge1=='y')
                    {
                     printf("***********请输入更改后的number************\n");
                        fflush(stdin);
                        scanf("%s",numberedit);
                        strcpy(headp->number,numberedit);
                    }
                    printf("*****是(y/Y)否(输入任意)更改对应的name*****\n");
                    fflush(stdin);
                    scanf("%c",&judge1);
                    if(judge1=='Y'||judge1=='y')
                    {
                        printf("************请输入更改后的name*************\n");
                        fflush(stdin);
                        scanf("%s",nameedit);
                        strcpy(headp->name,nameedit);
                    }     
                }
                headp=headp->next;
                if(headp==0&&!judge1)
                {
                    printf("没有找到想要删除的数据是(y/Y)否(任意)重新输入\n");
                    fflush(stdin);
                    judgegn=getchar();
                    if(judgegn=='y'||judgegn=='Y')
                    {
                     printf("********请重新输入想要修改的number*********\n");
                        fflush(stdin);
                        scanf("%s",numberedit);
                        headp=head;
                    }
                }    
            }
        }break;
        case 2:
        {
            printf("**********请输入想要查找的name*************\n");
            fflush(stdin);
            scanf("%s",nameedit);
            while(headp)
            {
                if(strcmp(nameedit,headp->name)==0)
                {
                    printf("***********已找到相应的数据元素************\n");
                    printf("****是(y/Y)否(输入任意)更改对应的number****\n");
                    fflush(stdin);
                    scanf("%c",&judge1);
                    if(judge1=='Y'||judge1=='y')
                    {
                     printf("***********请输入更改后的number************\n");
                        fflush(stdin);
                        scanf("%s",numberedit);
                        strcpy(headp->number,numberedit);
                    }
                    printf("*****是(y/Y)否(输入任意)更改对应的name*****\n");
                    fflush(stdin);
                    scanf("%c",&judge1);
                    if(judge1=='Y'||judge1=='y')
                    {
                        printf("************请输入更改后的name*************\n");
                        fflush(stdin);
                        scanf("%s",nameedit);
                        strcpy(headp->name,nameedit);
                    }     
                }
                headp=headp->next;
                if(headp==0&&!judge1)
                {
                    printf("没有找到想要删除的数据是(y/Y)否(任意)重新输入\n");
                    fflush(stdin);
                    judgegn=getchar();
                    if(judgegn=='y'||judgegn=='Y')
                    {
                     printf("*********请重新输入想要修改的name**********\n");
                        fflush(stdin);
                        scanf("%s",nameedit);
                        headp=head;
                    }
                }    
            }
        }break;
        }
    }
}
void lookfor(LB* head)
{
    LB* check=head;
    printf("******************************************\n");
    while(check)
    {
    printf("%-20s               %s\n",check->number,check->name);
        check=check->next;
    }
    printf("******************************************\n");
}

写完这些之后发现注释不足容易让人无法理解,等待后期改正这段代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值