C语言建立链表并实现增删查改

27次阅读

共计 2437 个字符,预计需要花费 7 分钟才能阅读完成。

以下是本人完成的一个 C 语言建立链表并进行增删查改操作的程序,为方便学习,本人将整个程序分为 头文件 主函数 两部分:


1. 头文件(函数部分)

(1)初始化函数

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *head;
    int length;
    int capacity;
} Toslist; //Toslist 类型


// 初始化顺序表
Toslist initSeqlist() {
    Toslist list;
    list.length = 0;
    list.capacity = 5;
    list.head = (int *)malloc(10 * sizeof(int));

    if (!list.head)
    {printf("初始化失败!\n");
        exit(0);
    }
    return list;
}

(2)打印函数

// 打印顺序表
void displayList(Toslist list) {for (int i = 0; i < list.length; i++) {printf("%d", list.head[i]);
    }
    printf("\n");
}

(3)插入函数

// 插入元素
Toslist add(Toslist list, int elem, int pos) {if (list.length == list.capacity) {int *temp = (int *)realloc(list.head, (list.capacity + 1) * sizeof(int));// 判断空间是否足够,不够就另建链表

// 不直接用 head 而引入 temp 的作用:防止空间分配失败导致 head 失去原来的链表
        if (!temp) {
            list.head = temp;
            list.capacity += 1;
        }
    }

    // 插入位置及以后的元素后移

    for (int i = list.length - 1; i >= pos; i--) {list.head[i + 1] = list.head[i];
    }
    list.head[pos] = elem;
    list.length ++;
    return list;

    if (pos > list.length || pos < 0)
        printf("插入位置错误!\n");
    return list;
}

(4)删除函数

// 删除元素
Toslist delete(Toslist list, int pos) {for (int i = pos; i < list.length - 1; i++) {list.head[i] = list.head[i + 1];
    }

    list.length--;

    return list;

    if (pos < 0 || pos > list.length) {printf("删除位置有误!\n");
        return list;
    }
}

(5)查找函数

// 查
int search(Toslist list, int elem) { //elem 是查找的元素
    // 顺序查找
    for (int i = 0; i < list.length; i++) {if (elem == list.head[i]) {return i;}
    }
    return 0;
}

(6)替换函数

// 改
Toslist modify(Toslist list, int elem, int val) { //val 是要替换它的元素
    int pos = search(list, elem); // 获取要替换元素的位置
    list.head[pos] = val;
    return list;
}

2. 主函数

int main() {Toslist list = initSeqlist();
    int Addpos = -1, Addnum, Delpos, Serachnum,Modifynum;

    printf("请输入 5 个整数元素 \n");

    for (int i = 0; i < 5; i++) {scanf("%d", &list.head[i]);
        list.length++;
    }

    printf("顺序表中的元素有:\n");
    displayList(list);

    // 插入元素
    printf("要在哪个元素后插入元素?\n");
    while (Addpos < 0 || Addpos > list.length) {scanf("%d", &Addpos);

        if (Addpos < 0 || Addpos > list.length)
            printf("请输入正确的位置!\n");
    };

    printf("请输入需要插入的元素:\n"); scanf("%d", &Addnum);
    printf("在顺序表的第 %d 个元素后插入元素 %d 得到 \n", Addpos, Addnum);
    list = add(list, Addnum, Addpos);

    displayList(list);


    // 删除元素
    printf("要删除顺序表下标顺序中哪个元素?\n"); scanf("%d", &Delpos);
    printf("删除后得到:\n");

    list = delete(list, Delpos);
    displayList(list);


    // 查找
    printf("请输入需要查找的元素 \n"); scanf("%d", &Serachnum);

    int pos = search(list, Serachnum);
    if(pos)
        printf("元素 %d 的位置为第 %d 个 \n", Serachnum, pos+1);
    if(!pos){printf("表中无该元素 \n");
    }


    // 修改
    printf("请输入需要修改的元素:\n");scanf("%d",&Serachnum);
    printf("请输入要替换的数:\n");scanf("%d",&Modifynum);
    printf("将 %d 修改为 %d 得到:\n", Serachnum, Modifynum);
    list = modify(list, Serachnum, Modifynum);
    displayList(list);

    free(list.head);
    list.head = NULL;

    return 0;
}

以上程序本人已调试完毕,若程序有繁杂之处,欢迎批评指正!

如果有帮助,希望关注交流,谢谢????GershonHold 的博客

我的 GitHub 地址:GershonHold 的 Github

正文完
 0