首页 > 其他分享 >线性表-单链表c语言实现

线性表-单链表c语言实现

时间:2024-10-28 22:20:43浏览次数:7  
标签:结点 单链 线性表 LNode int next LinkList 语言

一、基本介绍

        回顾单链表的知识

二、单链表


#include<stdio.h> 
#include<cstdlib>

typedef int ElemType;
typedef int Status; 


#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define NULL 0

// 定义单链表中结点类型 
typedef struct LNode{
    ElemType data;//数据域 
    struct LNode *next;//指针域 
}LNode,*LinkList;
 


 //查找单链表中第i个元素 
Status GetElem_L(LinkList L,int i,ElemType *e){
    LNode *p ;
    int j;
    p = L->next; j=1;
    //判断条件 p 相当于 p!=NUll 
    //顺时针查找 直到p找到第i个 或 p 为空 
    while(p && j<i){
        p = p ->next; ++j;//TODO
    }
    if(!p || j > i){
        return ERROR;// 第i个元素不存在 
    }
    *e = p->data;//取值
    return OK;         
}

//在带头结点的单链表L的第i个位置插入元素e 
Status ListInsert_L(LinkList L,int i,ElemType e){
    LNode *p, *s; 
    p=L; 
    int j=0;//p为指向单链表头指针,j为计数器 
    while(p && j < i-1){ //找到插入位置, i 结点的前驱 
        p = p->next;
        ++j;
    }
    if (!p || j > i-1) {
        return ERROR; //位置不合法 
    }
    s = (LinkList)malloc(sizeof(LNode));//创建一个新结点,LinkList相当于LNode* 
    if(!s) exit(OVERFLOW);                 //溢出错误,退出程序    
    s->data = e;                         //新结点赋值 
    s->next = p->next;                    //新结点插入单链表 
    p->next =s;                            
    return OK; 

//单链表L中,删除第i个元素,并由e 返回其值
Status ListDelete_L(LinkList L,int i,ElemType *e){
    LNode *p,*q;//指向数据结点的指针
    int j;//j 计数器
    p=L;j=0;
    while(p->next && j<i-1){//找到删除元素的位置 ,条件p->next保证被删结点存在 
        p = p->next;
        ++j;
    }
    if(!(p->next) || j > i-1){//删除位置不合法 
        return ERROR;
    } 
    q = p->next; p->next = q->next;//q 指向被删除结点 
    *e = q->data; free(q); //释放q 所指向的内存空间 
    return OK;
}

//逆位序输入n个元素的值,建立单链表
void CreateList_L(LinkList L,int n){
    LNode *p;
    int i; //循环控制变量 

    printf("请逆位序输入%d个数据元素的值\n",n); 
    for (i=n;i>0;--i){
        p = (LinkList)malloc(sizeof(LNode));
        if (!p) exit(OVERFLOW);
        scanf("%d",&p->data);//数据域的首地址 
        p->next = L->next;//新结点p 指向单链表第一个数据结点 
        L->next = p;
    } 
}//CreateList_L

//单链表遍历操作
Status VisitList_L(LinkList L){
    LNode *p;//指向待访问数据结点的指针 
    if(!L->next) {
        printf("该单链表为空表");
        return ERROR; 
    }
    p= L->next;//p 指向单链表第一个数据结点 
    printf("单链表中数据结点为:");
    while(p){//条件 p为非空结点 
        printf("%d ->",p->data);
        p= p->next;
    }
    printf("NULL\n");
    return OK; 
} //VisitList_L

//清空单链表
void ClearList(LinkList L) {
    LNode *p;//指向待删除结点 
    while(L->next){//条件 L->next 保证单链表非空 
        p= L->next;//P 指向单链表第一个结点 
        L->next = p->next;// 逻辑删除p所指结点
        free(p);//释放p 
    }
}

三、测试

//函数声明  略

int main(){
     int n,i,j;
     ElemType e;
     LinkList L = (LinkList)malloc(sizeof(LNode));
     L->next =NULL;
     printf("请输入创建单链表中结点个数:");
    scanf("%d",&n); 
    CreateList_L(L,n);
    //测试遍历 
    VisitList_L(L);
    //测试取元素
    printf("请输入待取元素为序:");
    scanf("%d",&i); 
    if(GetElem_L(L,i,&e))
        printf("第%d个数据元素为%d\n",i,e);
    else
        printf("第%d个数据元素不存在!",i);
    //测试删除元素 
    printf("请输入删除元素的位序:");
    scanf("%d",&j);
    if(ListDelete_L(L,j, &e))
        printf("删除第%d个数据元素为%d",j,e);
    else 
        printf("删除失败"); 
    
    ClearList(L);
    free(L);
    return 0;
          
 }

四、心得

        eeeeeee
       函数ListDelete_L(LinkList L,int i,ElemType *e),调用时ListDelete_L(L, i,&e)

标签:结点,单链,线性表,LNode,int,next,LinkList,语言
From: https://blog.csdn.net/sakura_lllllll/article/details/143267623

相关文章

  • C语言教学——编程基础与C语言入门
    引言在上一篇中,我们介绍了计算机的基本组成和工作原理。本篇文章将深入探讨编程的基本概念,特别是C语言的特性和基本语法,帮助初学者更好地理解如何编写程序。我们将从编程语言的分类入手,逐步引导读者进入C语言的世界。1.编程的定义编程是指通过编写代码来创建计算机程序的过......
  • 网络编程 Linux环境 C语言实现
    进程间通信的延续跨电脑进程间通信一、远程通信方式电路交换------老式有线电话通信​报文交换​分组交换支持分时机制的(分片机制)报文交换​现行网络大部分都是采用分组交换形式二、网络&互联网&因特网网络Network:多台计算机通过某种传输介质连接在一起形成......
  • 基于Java语言的职业高中智慧作业试题系统的设计与实现(源码+文档+部署视频)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Go语言的系统监控和日志分析
    ###开头段落:在处理Go语言的系统监控和日志分析时,关键的方式包括:使用标准库log进行日志记录、采用第三方库如logrus或zap提供更高级的日志管理功能、使用pprof进行性能监控、利用expvar发布服务内部信息等。这些方式既包含了基础的日志记录,也涵盖了性能和状态监控的高级应用。......
  • 水仙花数c语言程序:实操解答
    水仙花数(Narcissisticnumber)是指一个三位数,其各个位上数字的立方和等于该数本身。比如153就是水仙花数,因为\(1^3+5^3+3^3=153\)。以下是一个C语言程序,用于判断一个三位数是否为水仙花数,并输出100到999范围内的所有水仙花数:```c#include<stdio.h>#include<math.h>......
  • Go 语言有哪些劣势
    在回答Go语言的劣势之前,首先应该明确,Go语言(又称Golang)是一种高效的、静态类型的编程语言,它由Google开发,旨在提供简洁、高效且可读性强的编程环境。然而,尽管Go语言在并发处理、编译速度及静态类型系统方面有显著的优势,但它也存在一些劣势,例如:泛型支持有限、错误处理繁琐、第三方库......
  • C语言和Rust在安全性特性上的区别
    #C语言和Rust在安全性特性上的区别在探讨C语言和Rust在安全性特性上的区别时,我们可以明确地指出几个核心观点:Rust提供了内存安全保证、并发安全、以及错误处理机制,这些特性在编译时就能够避免许多常见的错误类型,显著提高了软件的安全性和可靠性。其中,内存安全保证是Rust最为突......
  • C语言和Groovy在JVM兼容性上的区别
    ##C语言和Groovy在JVM兼容性上的区别在探讨C语言和Groovy在JVM(Java虚拟机)兼容性上的差异时,核心观点可以概括为:C语言不直接兼容JVM、Groovy与JVM高度兼容。C语言是一种通用的、过程式的编程语言,它直接编译为机器语言,执行效率高,但它并不直接兼容JVM,这是因为JVM是为运行Java字节码......
  • 【数据库】数据库的基本概念 MySQL数据定义语言DDL
    文章目录基本概念数据库数据库管理系统MySQL数据定义DDL操作数据库操作数据表查看数据表创建数据表列类型修改数据表删除数据表基本概念数据库(Database简称DB):是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合......
  • C语言中的条件编译是什么
    文章开头:在C语言中,条件编译是一种以编译器指令为基础的编程技术。这种技术允许代码在编译时进行条件判断,并根据这些条件判断来选择是否编译某些代码段,使得我们可以在不改变源代码文件的情况下,创建多个版本的程序。主要涉及的编译预处理指令有`#if`、`#ifdef`、`#ifndef`、`#elif`......