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

数字探秘者
• 阅读 2677

以下是本人完成的一个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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
22 22
4年前
【数据结构之链表】看完这篇文章我终于搞懂链表了
一览:本文从零介绍链式存储结构的线性表——单链表。包括以下内容:什么是链式存储存储结构?单链表的结构辨析头结点、头指针等易混淆概念基本的增删改查操作(不带头结点和带头结点)单链表与顺序表的对比线性表的链式存储结构在一文中我们介绍了一种“用曲线连接”的线性表,“曲线”是一种形象化的语言,实际上并不会存在所谓“曲线”的这种东西。所谓“曲线连
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
CuterCorley CuterCorley
4年前
C语言入门系列之7.函数的定义、参数、调用和存储类别
一、概述1.函数基本概念一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能,子程序由函数来完成。一个C程序可由一个主函数和若干个其他函数构成。函数间的调用关系可能如下:由主函数调用其他函数,其他函数也可以互相调用,同一个函数可以被一个或多个函数调用任意多次。简单测试如下:cinclude
CuterCorley CuterCorley
4年前
C语言入门系列之3.顺序程序设计和输入输出
从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构,这三种基本结构可以组成各种复杂程序,C语言提供了多种语句来实现这些程序结构。同时C语言提供的输入输出的函数为IO提供了方便的工具。一、C语句介绍1.C基本语句C程序的执行部分是由语句组成的,程序的功能也是由执行语句实现的。C语句可分为以下五类:表达式语句表达式语句:
Wesley13 Wesley13
3年前
JAVA实现双向链表的增删功能
JAVA实现双向链表的增删功能,完整代码  1.packagelinked;3.classLinkedTable{5.}6.publicclassLinkedTableTest{8.  //构造单链表9.  staticNodenode1newNode("name1");10.
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
小万哥 小万哥
1年前
C 语言函数:入门指南
C语言中的函数声明和定义您可以通过以下方式创建并调用函数:c//创建一个函数voidmyFunction()printf("我刚被执行了!");intmain()myFunction();//调用函数return0;一个函数包括两个部分:声明:函数名称、返
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(