单向链表实现增删改查的操作
发布日期:2021-05-10 23:38:51 浏览次数:29 分类:精选文章

本文共 3203 字,大约阅读时间需要 10 分钟。

单向链表的增删改查操作实现

作为一名学习C语言的新手,我最近在实践链表数据结构的操作。链表是一种非常基础的数据结构,由节点组成,每个节点包含数据字段和指向下一个节点的指针。通过这一项目,我掌握了链表的增、删、改、查操作的实现方法。

链表操作概述

本文实现的链表包含以下功能:

  • :在链尾、链中、链头增加节点
  • :在链头、链中、链尾删除单个或多个节点
  • :在链头、链中、链尾更改单个或多个节点数值
  • :显示整个链表所有节点的数值

节点结构与初始化

节点结构定义如下:

struct node {    int data;    struct node *next;};

链表的初始化函数list_init创建一个空链表:

struct node *list_init() {    struct node *head = malloc(sizeof(struct node));    head->next = NULL;    return head;}

增操作实现

  • 链尾添加节点
  • int addtail(int newdata, struct node *list) {    struct node *p = list;    while (p->next != NULL) {        p = p->next;    }    struct node *new = newnode(newdata);    p->next = new;}
    1. 链中插入节点
    2. int insert(int olddata, int newdata, struct node *list) {    int b = 0;    struct node *p = list;    while (p->next != NULL) {        if (p->data == olddata) {            struct node *new = newnode(newdata);            new->next = p->next;            p->next = new;            b = 1;            if (olddata == newdata) {                p = p->next;            }        }        p = p->next;    }    if (p->next == NULL && p->data == olddata) {        struct node *new = newnode(newdata);        p->next = new;        b = 1;    }    printf("\n=====在链表中插入节点%d=====\n", olddata, newdata);    if (b == 0) {        printf("原链表节点没有%d这个数值!\n", olddata);    }}

      删操作实现

      int delnode(int deldata, struct node *list) {    int b = 0, m = 0;    struct node *q = list;    struct node *p = list->next;    printf("\n=====删除节点%d=====\n", deldata);    while (p != NULL) {        if (p->data == deldata) {            q->next = p->next;            p->next = NULL;            free(p);            b = 1;            m = 1;        }        if (m == 1) {            p = q->next;            m = 0;        } else {            p = p->next;            q = q->next;        }    }    if (b == 0) {        printf("原链表节点没有%d这个数值!\n", deldata);    }}

      改操作实现

      int change(int olddata, int newdata, struct node *list) {    int b = 0;    struct node *p = list->next;    while (p != NULL) {        if (p->data == olddata) {            p->data = newdata;            b = 1;        }        p = p->next;    }    printf("\n=====更改节点%d为%d=====\n", olddata, newdata);    if (b == 0) {        printf("原链表节点没有%d这个数值!\n", olddata);    }}

      展示所有节点

      void show(struct node *list) {    printf("链表各节点:\t");    struct node *p = list->next;    while (p != NULL) {        printf("%d\t", p->data);        p = p->next;    }    printf("\n");}

      主函数实现

      int main(int argc, char **argv) {    struct node *list = list_init();    addtail(350, list);    addtail(100, list);    addtail(200, list);    addtail(200, list);    addtail(250, list);    addtail(800, list);    addtail(200, list);    addtail(100, list);    show(list);        insert(100, 150, list);    show(list);        delnode(200, list);    show(list);        delnode(150, list);    show(list);        delnode(350, list);    show(list);        change(250, 500, list);    show(list);        insert(700, 150, list);    show(list);        delnode(700, list);    show(list);        change(700, 150, list);    show(list);        return 0;}

      运行结果分析

      通过实际运行可见,链表操作功能实现良好。从初始链表构建到增删改查,每一步操作都能正确反映在链表中。例如,插入150后链表中出现150节点;删除200后链表长度减少;更改250为500后链表中对应节点更新。

      通过这一项目,我对链表操作有了更深入的理解,也掌握了实际编程中的各种技巧。

    上一篇:顺序表实现增删改查的操作
    下一篇:统计任意一个文件中,某字符串(hello为例)出现的次数

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月02日 22时42分14秒