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

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

时间:2024-06-05 22:26:25浏览次数:18  
标签:node pLink temp int C语言 链表 表表 基本操作 pNext

链表插入元素

同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下 3 种情况:
插入到链表的头部(头节点之后),作为首元节点;
插入到链表中间的某个位置;
插入到链表的最末端,作为链表中最后一个数据元素;

虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操作,即可将新元素插入到指定的位置:
将新结点的 next 指针指向插入位置后的结点;
将插入位置前结点的 next 指针指向插入结点;

例如,我们在链表 {1,2,3,4} 的基础上分别实现在头部、中间部位、尾部插入新元素 5,其实现过程如图 1 所示:
image
从图中可以看出,虽然新元素的插入位置不同,但实现插入操作的方法是一致的,都是先执行步骤 1 ,再执行步骤 2。
注意:链表插入元素的操作必须是先步骤 1,再步骤 2;反之,若先执行步骤 2,除非再添加一个指针,作为插入位置后续链表的头指针,否则会导致插入位置后的这部分链表丢失,无法再实现步骤 1。

链表删除元素

从链表中删除指定数据元素时,实则就是将存有该数据元素的节点从链表中摘除,但作为一名合格的程序员,要对存储空间负责,对不再利用的存储空间要及时释放。因此,从链表中删除数据元素需要进行以下 2 步操作:
将结点从链表中摘下来;
手动释放掉结点,回收被结点占用的存储空间;

其中,从链表上摘除某节点的实现非常简单,只需找到该节点的直接前驱节点 temp,执行一行程序:
image

代码的实现思路

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//单链表操作
//思考问题
//1.添加、删除的时候位什么事pos-1 而不是 pos
//2.节点添加的过程怎么操作
typedef struct Node {
    int elem;
    struct Node * pNext;
} node;
//链表初始化
node * initLink(){
    node * p = (node *)malloc(sizeof(node));//头结点
    p->pNext=NULL;
    p->elem=0;
    node * temp = p;//头指针
    for(int i=0;i<=5;i++){
        node * p1 = (node *)malloc(sizeof(node));
        p1->elem = i+1;
        p1->pNext=NULL;
        temp->pNext = p1;
        temp=p1;
    }
    return p;
}
//打印链表
void display(node * pLink){
    node * temp = pLink->pNext;
    while(temp->pNext != NULL){
        printf("%d\n",temp->elem);
        temp = temp->pNext;
    }
}
//添加
void addNode(node * pLink, int pos, int elem){
    int index = 1;
    node * temp = pLink->pNext;
    while(index < pos-1){//思考下位什么要pos-1 而不是 pos
        temp = temp->pNext;
        index++;
    }
    node * p1 = (node *) malloc(sizeof(node));
    p1->elem = elem;
    p1->pNext = temp->pNext;
    temp->pNext = p1;
}
//删除节点
void delNode(node * pLink, int pos){
    node * temp = pLink->pNext;
    int index =1;
    while(index < pos-1){
        temp = temp->pNext;
        index++;
    }
    node * del = temp->pNext;//释放节点
    temp->pNext = temp->pNext->pNext;
    free(del);
}
//查找数据对应位置
int findNode(node * pLink,int elem){
    node * temp = pLink->pNext;
    int index  = 1;
    while(temp->pNext != NULL){
        if(temp->elem == elem){
            break;
        }
        temp = temp->pNext;
        index++;
    }
    return index;
}

void repNode(node * pLink, int pos ,int elem){
    node * temp = pLink->pNext;
    int index =1;
    while(index < pos){
        temp = temp->pNext;
        index++;
    }
    temp->elem = elem;
}

int main(){
    node * pLink = initLink();//初始化
    addNode(pLink,3,100);
    addNode(pLink,4,90);
    //delNode(pLink,3);//删除

    findNode(pLink,100);//找数字
    repNode(pLink,4,40);
    display(pLink);//打印
}

标签:node,pLink,temp,int,C语言,链表,表表,基本操作,pNext
From: https://www.cnblogs.com/zh718594493/p/18234015

相关文章

  • mysql阶段02 数据库基本操作, 误删用户案例解决, 数据库体系结构, mysql服务构成, mys
    一、数据库基本操作1.设置数据库密码[root@db03~]#mysqladmin-urootpassword'123456'2.使用密码登录#1.正确的登录方式[root@db03~]#mysql-uroot-p123456[root@db03~]#mysql-uroot-p123456#2.错误的登录方式[root@db03~]#mysql-uroot-p123456#3......
  • 基于调用C语言作为reference_model的UVM对全加器的验证
    代码来自于,本篇文章只对其中的细节做探讨UVM的基本教程-CSDN博客首先DUT为加法器,但是舒服不仅是加数和被加数,还有ready和valid,输出也不止是和,还有valid和ready。valid代表数据有效,ready表示已经准备好发送或者接收。加法器的设计语言中,共有三个状态,INITIAL/WAIT/SEND,rst为1......
  • 基于c语言的UDP客户端、服务端二合一基础代码
    基于c语言的UDP客户端、服务端二合一基础代码示意图:准备好了吗,以下是基础代码:/****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是......
  • 基于c语言的TCP客户端、服务端基础代码
    基于c语言的TCP客户端、服务端基础代码基本流程:客户端:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/......
  • 初识C语言(03)—学习笔记
    常见关键字C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。归类下面是按照关键字的用途不同进行的归类变量的命名规则有意义,例如intage;floatsalary;等名字必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字......
  • C语言排序
    一、排序的运用生活中排序随处可见,比如我们高考时的排名,大学学校水平的排名等,打开京东,可以发现每样商品按照不同的方式排序,比如综合,销量,价格。其内部需要排序代码来完成。二、常见的排序算法一、交换排序一、冒泡排序冒泡排序是一种最容易想到的排序,但是其效率不高,没有实......
  • 使用C语言实现链式栈
    一、栈的基本概念        栈(Stack)是一种数据结构,它遵循“后进先出”(LIFO,LastInFirstOut)的原则。这意味着最后一个插入栈的元素最先被删除,你可以理解成一堆盘子,每次只能取最上面的盘子,删除的时候也只能删除最上面的盘子。这样是不是更容易理解了呢?栈的基本操作包......
  • 【C语言】文件操作强化
    【C语言】文件操作强化文章目录【C语言】文件操作强化前言一、文件打开关闭文件打开(fopen)文件关闭(fclose)二、文件读写函数字符读写函数行读写函数块读写函数格式化读写函数随机读写函数三、文件读写注意事项四、配置文件读写案例总结前言本篇文章我们将详细......
  • C语言判断文件存在和创建文件
    用C语言可以实现新建文件,这里要用到一个fopen函数,它是一个非常强大的函数,可以以各种方式创建、读取文件,具体语法如下:文件指针名=fopen(文件名,使用文件方式);“文件指针名”必须是被说明为File类型的指针变量;“文件名”是被打开文件的文件名,也包括路径;“使用文件方式”是指文件的......
  • 【C++小知识】为什么C语言不支持函数重载,而C++支持
    为什么C语言不支持函数重载,而C++支持编译链接过程函数名修饰过程总结在了解C++函数重载前,如果对文件的编译与链接不太了解。可以看看我之前的一篇文章,链接:文件的编译链接想要清楚为什么C语言不支持函数重载而C++支持,有俩个过程:1.编译链接。2.函数名修饰过程。编译......