首页 > 其他分享 >C语言数据结构实现-静态链表2-基本操作

C语言数据结构实现-静态链表2-基本操作

时间:2024-06-13 23:13:20浏览次数:7  
标签:body int C语言 链表 静态 tempbody table 基本操作

上节,我们初步创建了一个静态链表,本节学习有关静态链表的一些基本操作,包括对表中数据元素的添加、删除、查找和更改。

本节是建立在已能成功创建静态链表的基础上,因此我们继续使用上节中已建立好的静态链表学习本节内容,建立好的静态链表如图 1 所示:
image

静态链表添加元素

例如,在图 1 的基础,将元素 4 添加到静态链表中的第 3 个位置上,实现过程如下:
从备用链表中摘除一个节点,用于存储元素 4;
找到表中第 2 个节点(添加位置的前一个节点,这里是数据元素 2),将元素 2 的游标赋值给新元素 4;
将元素 4 所在数组中的下标赋值给元素 2 的游标;

经过以上几步操作,数据元素 4 就成功地添加到了静态链表中,此时新的静态链表如图 2 所示
image

静态链表删除元素

静态链表中删除指定元素,只需实现以下 2 步操作:
1、将存有目标元素的节点从数据链表中摘除;
2、将摘除节点添加到备用链表,以便下次再用;
提示:若问题中涉及大量删除元素的操作,建议读者在建立静态链表之初创建一个带有头节点的静态链表,方便实现删除链表中第一个数据元素的操作。

静态链表查找元素

静态链表查找指定元素,由于我们只知道静态链表第一个元素所在数组中的位置,因此只能通过逐个遍历静态链表的方式,查找存有指定数据元素的节点。

静态链表查找指定数据元素的 C 语言实现代码如下

静态链表中更改数据

更改静态链表中的数据,只需找到目标元素所在的节点,直接更改节点中的数据域即可

总结

#include<stdio.h>
#include<stdlib.h>
#define MAXSize 8
typedef struct {
    int data;
    int curr;
} Node;
int  CreateTable(Node *);
void displayTable(Node *, int);
int MallocNode(Node *);
int initTable(Node *);
void insertTable(Node *, int body , int add, int num);
void delTable(Node * , int, int);
int SelecEum(Node * , int , int);
int ChangeNum(Node * , int , int ,int );
int main(){
    Node  arrayTable[MAXSize];
    int body = initTable(arrayTable);
    insertTable(arrayTable,body, 2, 100);
    insertTable(arrayTable,body, 3, 76);
   // delTable(arrayTable, 100,body);
    // int res = SelecEum(arrayTable, body, 76);

    ChangeNum(arrayTable,body,76,34);

    displayTable(arrayTable,body);
    return 0;
}

//变化内容
int ChangeNum(Node * table, int body,int oldNum, int newNum){
    int changeIndex = SelecEum(table,body,oldNum);
    if(changeIndex == -1){
        printf("没有元素");
    }
    table[changeIndex].data = newNum;
    return 0;
}


//查询
int SelecEum(Node * table, int body, int num){
    int tempbody = body;
    while(table[tempbody].curr != 0){
        if(table[tempbody].data == num){
            return tempbody;
        }
        tempbody = table[tempbody].curr;
    }
    return -1;
}


//删除一个节点
void delTable(Node * table, int num, int body) {
    int tempbody = body;

    while(table[tempbody].data != num){
        tempbody = table[tempbody].curr;
    }
    int del = tempbody;//要删除元素位置
    tempbody = body;

    while(table[tempbody].curr != del){
        tempbody = table[tempbody].curr;//提前一个
    }
    table[tempbody].curr = table[del].curr;

    table[del].curr = table[0].curr;
    table[0].curr = del;

}
//添加操作
void insertTable(Node * table, int body, int add, int num){
    int tempbody = body;
    for(int i=1;i<add;i++){
        tempbody = table[tempbody].curr;
    }
    int insert = MallocNode(table);
    table[insert].data = num;
    table[insert].curr = table[tempbody].curr;
    table[tempbody].curr = insert;
}

//初始化
int initTable(Node * table){
    CreateTable(table);
    int body = MallocNode(table);
    int tempbody = body;
    for(int i=1;i<5;i++){
        int j = MallocNode(table);
        table[tempbody].curr = j;
        table[j].data = i+1;
        tempbody = j;
    }
    table[tempbody].curr=0;//新的链表最后一个结点的指针设置为0
    return body;
}


int MallocNode(Node * table){
    int i;
    if(table[0].curr){
        i = table[0].curr;
        table[0].curr = table[i].curr;
    }
    return i;
}

//创建
int CreateTable(Node * table){
    for(int i=0;i<MAXSize;i++){
        table[i].curr = i+1;
        table[i].data = 0;
    }
    table[MAXSize-1].curr = 0;
 }
 void displayTable(Node * table, int body){
    int tempbody = body;
    while(table[tempbody].curr){
        printf("%d\n",table[tempbody].data);
        tempbody = table[tempbody].curr;
    }
 }

标签:body,int,C语言,链表,静态,tempbody,table,基本操作
From: https://www.cnblogs.com/zh718594493/p/18246926

相关文章

  • C语言-运算符
    运算符有几个操作数就是几元运算符1、算术运算符*运算符**描述**操作数个数(几元运算符)**组成的表达式的值**副作用*+正号1操作数本身无-负号1操作数符号取反无+加号2两个操作数之和无-减号2两个操作数之差无*****乘号2两个......
  • C语言数据结构实现-静态链表1-初始化
    《顺序表和链表优缺点》一节,我们了解了两种存储结构各自的特点,那么,是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素。静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。使......
  • 第一个c语言程序
    我们有两种方式从计算机获得信息:一是看屏幕上的文字、图片、视频等,二是听从喇叭发出来的声音。让喇叭发出声音目前还比较麻烦,我们先来看看如何在屏幕上显示一些文字吧。在屏幕上显示文字非常简单,只需要一个语句,例如,下面的代码会让屏幕显示出“C语言中文网”:puts("C语言中文网......
  • 3个月搞定计算机二级C语言!高效刷题系列进行中
    前言大家好,我是梁国庆。计算机二级应该是每一位大学生的必修课,相信很多同学的大学flag中都会有它的身影。我在大学里也不止一次的想要考计算机二级office,但由于种种原因,备考了几次都不了了之。这一次我想换个目标!备考计算机二级C语言今天山东省考试院发布了关于2024年9月全......
  • 线性表的链式表示——链表
    目录一、单链表1、单链表的定义2、单链表的基本操作 (1)单链表的初始化(2)插入操作(3)删除操作(4)查找操作(5)求表长操作(6)单链表的建立 二、双链表三、循环链表 1、循环单链表2、循环双链表四、静态链表 五、顺序表和链表的比较1、存取方式2、逻辑结构与物理结构3......
  • C语言练习题05
    练习1:使用二维数组计算杨辉三角#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(intargc,constchar*argv[]){intm,i,j;printf("请输入你所要打印的杨辉三角的列数:\n");scanf("%d",&m);putchar(10);int......
  • C语言练习题04
    练习1:输入一个5个元素的一维数组,实现冒泡排序。#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(intargc,constchar*argv[]){ inttemp; inta[5]={0}; for(inti=0;i<5;i++) { printf("请输入一个数:\n"); scanf("%d"......
  • 单细胞RNA测序(scRNA-seq) 理解Seurat对象存储信息含义和基本操作
    单细胞测序技术是在单个细胞水平上,对基因组、转录组和表观基因组水平进行分析测序技术。bulkRNA-seq获得的是组织或器官等大量细胞中表达信号的均值,无法获取细胞之间的差异信息(即丢失了细胞的异质性),而单细胞测序技术可以很好的弥补bulkRNA-seq这一不足,即获取混合样本中......
  • Day7—zookeeper基本操作
    ZooKeeper介绍ZooKeeper(动物园管理员)是一个分布式的、开源的分布式应用程序的协调服务框架,简称zk。ZooKeeper是ApacheHadoop项目下的一个子项目,是一个树形目录服务。ZooKeeper的主要功能配置管理分布式锁集群管理Zookeeper数据模型​ZooKeeper是一个树形目......
  • c语言编译器的分类
    前言在上节《C语言编译和链接》中我们已经讲解了C语言编译器的概念,由于C语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款C语言编译器,它们各有特点,适用于不同的平台,本节就来给大家科普一下。我们分两部分介绍C语言的编译器,分别是......