小工具知识网

当前位置: 首页 > 行业知识 > 【C语言篇】链表的基本操作-创建链表、插入节点、删除节点、打印链表

行业知识

【C语言篇】链表的基本操作-创建链表、插入节点、删除节点、打印链表

2026-11-07 08:18:52 来源:互联网转载
  • 博主简介:努力学习的预备程序媛一枚~
  • 博主主页: @是瑶瑶子啦
  • ���属专栏: C/C++

    前言:

    (单向)链表的基本介绍

    链表是在物理上(内存空间)非连续,非顺序的一种数据结构

    • 在C语言中,简单来说,是用结构体和指针来实现链表(linkNode)结构的。
      • 结构体:节点
      • 指针:箭头(负责链接两个节点)

        接下来,通过一个题目(涉及到链表的全部基础操作),来学习链表的基础操作!

        目录

        • 前言:
          • (单向)链表的基本介绍
          • Part1:题目描述
          • Part2:结构体重命名
          • Part3:主函数部分
          • Part4:创建链表函数实现:create_linklist()
          • Part5:插入/增加节点:insert_node()
          • Part6:删除节点-delete_node()
          • Part7:打印链表
          • Part8:完整代码复现
          • Part9:细节

            Part1:题目描述

            题目描述:

            输入文件的第一行有两个整数n,q,分别表示初始链表中元素个数和对链表操作的次数,第二行有n个整数,表示初始链表的元素,保证这些数字不超过int表示的取值范围。接下来q行,每行可能为如下两个操作之一:

            1 a b表示在第a个元素后面插入值为b的元素,

            2 a表示将链表中第a个元素删除,如果a大于当时链表长度,则忽略此操作

            输入说明

            输入第一行是2个整数数字,表示n和q;第二行是n个整数,其间用一个半角空格间隔;接下来有q行数字,以1开头表示插入操作,以2开头表示删除操作。

            输出说明

            输出有1行,表示操作后的链表的所有结点的数据,数字间用一个半角空格间隔。若链表为空,输出"空"。

            输入样例

            3 3

            1 2 3

            1 1 4

            1 2 5

            2 2

            输出样例

            1 5 2 3

            Part2:结构体重命名

            #define _CRT_SECURE_NO_WARNINGS 1#include #includetypedef struct node{    int data;    struct node* next;}NODE;

            Part3:主函数部分

            int main(){    int num_node = 0, num_oprt = 0;    scanf("%d %d", &num_node, &num_oprt);    NODE* head = create_linklist(num_node);//创建链表    for (int i = 0; i  num_node) {                break;            }            else {                head = insert_node(head, pos, data);            }            break;        }        case 2:        {            int pos = 0;            scanf("%d", &pos);            if (pos > num_node)            {                break;            }            else            {                delete_node(head, pos);            }            break;        }        }    }    if (head == NULL)        printf("空");    else        print_linklist(head);    return 0;}

            Part4:创建链表函数实现:create_linklist()

            struct node* create_linklist(int n)//创建n个结点的链表,返回表头{    NODE *head = NULL, * q = NULL, * p = NULL;    for (int i = 0; i data);        if (i == 0)        {            head = p;        }        else        {            q->next = p;        }        q = p;    }    p->next = NULL;    return head;}

            Part5:插入/增加节点:insert_node()

            struct node* insert_node(struct node* head, int pos, int data)//在以head为头的链表中第post的位置插入数据data,返回表头{    NODE* p = head, * q = head;    NODE* new_node = (NODE*)malloc(sizeof(NODE));    new_node->data = data;    for (int i = 1; i         q = p;        p = p-next;    }    if (p == NULL)    {        p->next = new_node;        new_node->next = NULL;    }    else    {        q->next = new_node;        new_node->next = p;    }    return head;}

            Part6:删除节点-delete_node()

            struct node* delete_node(struct node* head, int pos)//在以head为头的链表中删除第post的位置的结点,返回表头{    NODE* q = head, * p = head;    if (pos == 1)        return head->next;    for (int i = 2; i         q = p;        p = p-next;    }    if (p == NULL)    {        q->next = NULL;    }    else    {        q->next = p->next;        free(p);    }    return head;}

            Part7:打印链表

            void print_linklist(struct node* head)//输出以head为头的链表的所有结点数据{    NODE* p = head;    while (p != NULL)    {        printf("%d ", p->data);        p = p->next;    }}

            Part8:完整代码复现

            #define _CRT_SECURE_NO_WARNINGS 1#include #includetypedef struct node{    int data;    struct node* next;}NODE;struct node* create_linklist(int n)//创建n个结点的链表,返回表头{    NODE *head = NULL, * q = NULL, * p = NULL;    for (int i = 0; i data);        if (i == 0)        {            head = p;        }        else        {            q->next = p;        }        q = p;    }    p->next = NULL;    return head;}struct node* insert_node(struct node* head, int pos, int data)//在以head为头的链表中第post的位置插入数据data,返回表头{    NODE* p = head, * q = head;    NODE* new_node = (NODE*)malloc(sizeof(NODE));    new_node->data = data;    for (int i = 1; i         q = p;        p = p-next;    }    if (p == NULL)    {        p->next = new_node;        new_node->next = NULL;    }    else    {        q->next = new_node;        new_node->next = p;    }    return head;}struct node* delete_node(struct node* head, int pos)//在以head为头的链表中删除第post的位置的结点,返回表头{    NODE* q = head, * p = head;    if (pos == 1)        return head->next;    for (int i = 2; i         q = p;        p = p-next;    }    if (p == NULL)    {        q->next = NULL;    }    else    {        q->next = p->next;        free(p);    }    return head;}void print_linklist(struct node* head)//输出以head为头的链表的所有结点数据{    NODE* p = head;    while (p != NULL)    {        printf("%d ", p->data);        p = p->next;    }}int main(){    int num_node = 0, num_oprt = 0;    scanf("%d %d", &num_node, &num_oprt);    NODE* head = create_linklist(num_node);//创建链表    for (int i = 0; i  num_node) {                break;            }            else {                head = insert_node(head, pos, data);            }            break;        }        case 2:        {            int pos = 0;            scanf("%d", &pos);            if (pos > num_node)            {                break;            }            else            {                delete_node(head, pos);            }            break;        }        }    }    if (head == NULL)        printf("空");    else        print_linklist(head);    return 0;}

            Part9:细节

            1,typedef重定义后不用再像之前一样单独声明结构体类型了(否则会重定义)

            2,case语句中如果有定义或者声明局部变量需要加大括号(语法规定)

            3,在删除、插入函数中处理结点时要格外小心两个指针q和p循环结束后所指向的位置。


            原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!

上一篇:我旳单词怎么写?

下一篇:宝塔面板深度解析,功能概览、优缺点全揭秘!