当前位置: 首页 > news >正文

C链表的简单案例

此案例只是简单的使用链表

链表的特点:

  1.不需要提前知道要存入数据的长度

  2.最后结点为NULL

  3.头结点指向下一个结点的结构体指针

#include <stdio.h>
#include <process.h>

struct Student{
    char cName[20];    //姓名 
    int iNumber;    //学号 
    struct Student *pNext;    //指向下一个结点的地址 
}; 

int iCount;    //全局变量,用来表示链表长度 

//创建链表返回链表的头指针 
struct Student *Create(){
    struct Student *pHead = NULL;    //定义头指针
    struct Student *pEnd, *pNew;    //最后一个结点和新的结点
    
    iCount = 0;    //初始化链表长度
    
    //给最后 一个结点和新结点分配内存空间 
    pEnd = pNew = (struct Student *)malloc(sizeof(struct Student)); 
    //提示让其输入姓名和 学号 
     printf("please enter the name,then the number\n");
     scanf("%s", &pNew->cName);
     scanf("%d", &pNew->iNumber);
     
     //判断输入的学号是否为0,不为0就进行处理 
     while(pNew->iNumber    !=0){
         iCount++;    //结点加1
        if(iCount == 1){
            pHead = pNew;    //头指针指向下个结点的地址 
            pNew->pNext = pHead;
            pEnd = pNew;    //pEnd这是跟踪的指针结点 
        }else{
            pEnd->pNext = pNew;    //让之前的元素的指针指向下一个结点的地址 
            pNew->pNext = NULL;    //让当前的元素的指针域指向NULL 
            pEnd = pNew;
        }
        //再给pNew分配内存空间 
        pNew = (struct Student *)malloc(sizeof(struct Student)); 
         printf("please enter the name,then the number\n");
         scanf("%s", &pNew->cName);
         scanf("%d", &pNew->iNumber);
     }
     free(pNew);
     return pHead;
}


//输出链表
void Print(struct Student *pHead){
    struct Student *pTemp;    //定义一个临时指针
    int iIndex = 0;    //用来计算有多少个指针输出
    
    printf("=====the links has %d element======\n", iCount);
    printf("|iIndex|   name   |iNumber|\n");
    pTemp = pHead;
    while(pTemp != NULL){
        iIndex++;
        printf("%6d", iIndex);
        printf("%10s", pTemp->cName);
        printf("%7d\n", pTemp->iNumber);
        pTemp = pTemp->pNext; 
    }
    printf("===================================\n");
} 

//插入元素,只需要头指针就行,并返回头指针 
struct Student *Insert(struct Student *pHead){
    struct Student *pNew;
    pNew = (struct Student *)malloc(sizeof(struct Student));    //分配内存空间
    printf("请输入name和number :\n");
    scanf("%s", &pNew->cName);
    scanf("%d", &pNew->iNumber);
    pNew->pNext = pHead;
    pHead = pNew; 
    iCount++;    
    return pHead;
} 

//删除元素, 传一个头指针,以及第几个元素,无返回值
void Delete(struct Student *pHead, int iIndex){
    int i;    //用于循环
    struct Student *pPre;    //定义前一个结构体指针变量 
    struct Student *pTemp;    //定义要删除的结构体指针变量 
    pPre = pTemp = pHead;    //都指向pHead 
    
    //循环的目的是让pTemp为要删除的结点,pPre为其前面一个结点 
    for(i=1; i<iIndex; i++){
        pPre = pTemp;
        pTemp = pTemp->pNext; 
    }
    
    pPre->pNext = pTemp->pNext;    //删除pTemp结点
    free(pTemp);
    iCount--; 
}

//写入文件
void Save(struct Student *pHead){
    FILE *p;    //定义一个文件指针 
    struct Student *pTemp;    //定义一个结构体指针变量 
    p = fopen("data.txt", "a+");
    if(p == NULL){
        printf("打开文件失败!\n");
    }
    pTemp = pHead;
    while(pTemp!=NULL){
        //fputs(pTemp->cName, p);
        fprintf(p, "%15s", pTemp->cName);
        fprintf(p, "%10d", pTemp->iNumber);
        fputs("\n", p);
        pTemp = pTemp->pNext;
    }
    fclose(p);    //关闭指针 
} 

int main(){
    struct Student *pHead;
    pHead = Create();
    pHead = Insert(pHead);
    Delete(pHead, 2);
    Save(pHead);
    Print(pHead);
    return 0;
}


效果:

 

转载于:https://www.cnblogs.com/yuwensong/p/5445712.html

相关文章:

  • Java与面向对象设计
  • TCP与UDP的区别
  • Mysql Order By 字符串排序,mysql 字符串order by
  • Java7,AutoClosable
  • Java循环练习:婚礼上的谎言
  • yum命令使用大全   软件安装
  • Linux信号
  • 云计算如何结合DevOps推动软件交付成功
  • gnome-boxes 的安装与使用
  • ETL简介
  • 前端学习笔记之观察者模式
  • LeetCode: Min Stack 最小栈 Java
  • HTTP 之 套接字
  • 使用注解属性绑定
  • Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
  • hexo+github搭建个人博客
  • Android 架构优化~MVP 架构改造
  • conda常用的命令
  • CSS3 变换
  • FastReport在线报表设计器工作原理
  • Javascript基础之Array数组API
  • Laravel 菜鸟晋级之路
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • vue-router的history模式发布配置
  • 后端_MYSQL
  • 爬虫模拟登陆 SegmentFault
  • 使用docker-compose进行多节点部署
  • 算法-图和图算法
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 阿里云移动端播放器高级功能介绍
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #define,static,const,三种常量的区别
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (70min)字节暑假实习二面(已挂)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *Django中的Ajax 纯js的书写样式1
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .stream().map与.stream().flatMap的使用
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C++] Windows中字符串函数的种类
  • [C++] 统计程序耗时