自由的羽毛 发表于 2025-3-30 02:59:26

C语言之链表增删查改

1.知识百科

  链表(Linked List)是计算机科学中一种基础的数据结构,通过节点(Node)的链式连接来存储数据。每个节点包含两部分:存储数据的元素和指向下一个节点的指针(单链表)或前后两个指针(双链表)。


[*] 常见操纵
  插入:在头部、尾部或指定位置插入节点。
  删除:删除指定节点(需处理惩罚指针指向)。
  遍历:从头节点依次访问每个节点。
  查找:按值或位置查找节点(需遍历)。
2.链表操纵

2.1 创建链表

  创建一个链表,用于保存学生信息,分别存储姓名、学号和成绩。
https://i-blog.csdnimg.cn/direct/c1308f1caf7e4ee0a2a532eca7207715.png#pic_center
typedef struct STU{
        char name;
        char id;
        float score;
        struct STU *next;
}STU_INFO,*P_STU;
  添加节点,每一个节点保存一位学生信息。
/*录入信息*/
void STU_Input(P_STU node)
{
        printf("请输入姓名、学号、成绩:\n");
        scanf("%s%s%f",node->name,node->id,&node->score);
        while(getchar()!='\n');
}
/*
添加节点(尾插法)
*/
void STU_AddNode(P_STU *head)
{
        if(*head==NULL)
        {
                *head=malloc(sizeof(STU_INFO));//创建链表头
                (*head)->next=NULL;
                STU_Input(*head);//录入成员信息
                return ;
        }
        //链表头已存在
        P_STU phead=*head;
        //偏移指针,将phead指向链表尾
        while(phead->next!=NULL)
        {
                phead=phead->next;
        }
        //创建节点
        P_STU new_node=malloc(sizeof(STU_INFO));
        printf("添加节点:%p\n",new_node);
        phead->next=new_node;
        phead=phead->next;
        phead->next=NULL;//new_node->next=NULL;
        //录入信息
        STU_Input(new_node);//录入成员信息
}
2.2 遍历链表

  遍历链表,查看所有学生信息。
void STU_Output(P_STU head)
{
        P_STU phead=head;//指向链表头
        while(phead!=NULL)
        {
                printf("姓名:%s学号:%s成绩:%.1f\n",phead->name,phead->id,phead->score);
                phead=phead->next;
        }
}
2.3 删除节点

  根据名字查找子节点,并删除。
  当删除的节点为中间节点,删除过程如下:
https://i-blog.csdnimg.cn/direct/8f67521f97a84373b06174bdc70fbb9c.png#pic_center
  当删除的节点为头节点,删除过程如下:
https://i-blog.csdnimg.cn/direct/d31182ab0a584487a0f1642c9f39117f.png#pic_center
  节点删除代码实现如下,支持删除多个连续的重复节点。
//查找子节点进行删除
P_STU STU_FindNode_Del(P_STU head)
{
        //判断链表头是否为NULL
        P_STU phead=head;
        P_STU temp=head,temp2;
        char name;
        printf("请输入要查找的名字:\n");
        scanf("%s",name);
        while(getchar()!='\n');
        while(phead!=NULL)
        {
                if(strcmp(phead->name,name)==0)
                {
                        //要删除的数据在链表头
                        if(phead==head)
                        {
                                temp=phead;
                                phead=phead->next;
                                free(temp);
                                head=phead;
                        }
                        else{
                                //要删除的数据不在链表头
                                temp->next=phead->next;
                                temp2=phead;
                                phead=phead->next;
                                free(temp2);//释放节点
                        }
                }
                else //继续找下一个成员
                {
                        temp=phead;
                        phead=phead->next;//继续查找下一个成员
                }
        }
        return head;//返回链表头
}
  测试示例:
int main()
{
        P_STU head=NULL;//定义一个结构体指针
        int i=0;
        //添加节点
        while(1)
        {
                STU_AddNode(&head);
                i++;
                if(i>=4)break;
        }
        printf("遍历链表\n");
        STU_Output(head);
        printf("删除节点\n");
        head=STU_FindNode_Del(head);
        printf("剩余成员信息\n");
        STU_Output(head);
        return 0;
}
  运行效果:
wbyq@wbyq-virtual-machine $ ./a.out
请输入姓名、学号、成绩:
1 1 1
请输入姓名、学号、成绩:
2 2 2
请输入姓名、学号、成绩:
2 2 2
请输入姓名、学号、成绩:
3 3 3
遍历链表
姓名:1学号:1成绩:1.0
姓名:2学号:2成绩:2.0
姓名:2学号:2成绩:2.0
姓名:3学号:3成绩:3.0
删除节点
请输入要查找的名字:
2
剩余成员信息
姓名:1学号:1成绩:1.0
姓名:3学号:3成绩:3.0


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C语言之链表增删查改