先上代码:

#include <stdio.h>
#include <stdlib.h>// 节点结构体
struct Node
{int a;                                     // 数据位struct Node* pNext;                           // 地址位
};// 全局和局部的区别
struct Node* g_pHead = NULL;                   // 头指针
struct Node* g_pEnd = NULL;                        // 尾指针// 函数声明
void AddListTill(int a);                        // 创建一个链表,在链表中添加数据(尾添加)可以用于队列
void AddListHead(int a);                        // 创建一个链表,在链表中添加数据(头添加)可以用于栈
void DeleteHead();                              // 头删除
void DeleteTill();                              // 尾删除
void ScanList();                                // 遍历链表(查1个 或者全查)
struct Node* SelectNode(int a);                 // 查询指定节点
void FreeList();                                // 链表清空
void FreeRandNode(int a);                       // 删除指定节点
void AddListRand(int index, int a);             // 指定位置插入节点int main(void) {g_pHead;AddListTill(1);AddListTill(2);AddListTill(3);AddListTill(4);AddListHead(0);ScanList();                                   // 01234AddListRand(1,1);       ScanList();                                 // 011234DeleteHead();  ScanList();                                 // 11234DeleteTill();//ScanList();                                  // 1123struct Node* pFind; pFind = SelectNode(2);if (pFind != NULL) {printf("find num : %d\n", pFind->a);}else {printf("find nothing\n");}FreeRandNode(2);ScanList();                                  // 1134system("pause");return 0;
}void AddListTill(int a) {// 创建一个节点struct Node* pTmep = (struct Node*)malloc(sizeof(struct Node));// 节点数据赋值pTmep->a = a;pTmep->pNext = NULL;// 将节点链接到我的链表中if (NULL == g_pEnd || NULL == g_pHead) {g_pHead = pTmep;}else {g_pEnd->pNext = pTmep;}g_pEnd = pTmep;
}void AddListHead(int a) {// 创建一个节点struct Node* pTmep = (struct Node*)malloc(sizeof(struct Node));// 节点数据赋值pTmep->a = a;pTmep->pNext = NULL;// 将节点链接到我的链表中if (NULL == g_pEnd || NULL == g_pHead) {g_pHead = pTmep;g_pEnd = pTmep;}else {pTmep->pNext = g_pHead;g_pHead = pTmep;}
}void ScanList() {struct Node* pTemp = g_pHead;        // 定义一个中间变量指向头部为了防止改变原来的链表// bool类型 !pTemp  while (pTemp != NULL) {printf("  %d   ", pTemp->a);pTemp = pTemp->pNext;}printf("\n");
}struct Node* SelectNode(int a)
{struct Node* pTemp = g_pHead;     while (pTemp != NULL) {if (a == pTemp->a) {return pTemp;}pTemp = pTemp->pNext;}return NULL;
}void FreeList() {struct Node* pTemp = g_pHead;while (pTemp != NULL) {struct Node* pt = pTemp;pTemp = pTemp->pNext;free(pt);}// 一定记得要初始化方便下次操作g_pHead = NULL;g_pEnd = NULL;
}void FreeRandNode(int a) {if (NULL == g_pHead) {printf("链表为空,无需释放!!\n");}struct Node* pTemp = SelectNode(a);if (NULL == pTemp) {printf("没有这个节点\n");return;}// 一个节点if (g_pEnd == g_pHead) {DeleteHead();}// 两个节点else if (g_pHead->pNext == g_pEnd) {if (g_pHead == pTemp) {DeleteHead();}else if (g_pEnd == pTemp) {DeleteTill();}}// 多个节点else {if (g_pHead == pTemp) {DeleteHead();}else if (g_pEnd == pTemp) {DeleteTill();}else {// 找到要删除的前一个节点struct Node* pt= g_pHead;while (pt->pNext != pTemp){pt = pt->pNext;}// 链接pt->pNext = pTemp->pNext;// 释放free(pTemp);}}
}void DeleteHead() {if (NULL == g_pHead){printf("链表为空,无需释放!!\n");}// 记住旧的头struct Node* pTemp = g_pHead;// 下一个节点变成新的头g_pHead = g_pHead->pNext;// 释放旧的头free(pTemp);
}void DeleteTill() {if (NULL == g_pEnd) {printf("链表为空,无需释放!!\n");return;}if (g_pHead == g_pEnd) {free(g_pHead);g_pEnd = NULL;g_pHead = NULL;}else{// 找尾巴前一个节点struct Node* pTemp = g_pHead;while (pTemp->pNext != g_pEnd) {pTemp = pTemp->pNext;}  // 释放尾巴free(g_pEnd);// 尾巴前移g_pEnd = pTemp;// 尾巴下一个为空g_pEnd->pNext = NULL;}
}void AddListRand(int index, int a) {if (NULL == g_pHead) {printf("链表为空,无需释放!!\n");return;}struct Node* pt = SelectNode(index);if (NULL == pt) {printf("没有指定节点\n");return;}// 有节点创建新节点struct Node* pTmep = (struct Node*)malloc(sizeof(struct Node));pTmep->a = a;pTmep->pNext = NULL;// 链接到链表if (pt == g_pEnd) {g_pEnd->pNext = pTmep;g_pEnd = pTmep;}else {// 先连pTmep->pNext = pt->pNext;// 后断pt->pNext = pTmep;}
}

介绍:

链表是一种在物理存储单元上的一种非连续,非顺序的存储结构。这种结构是使用结构中的指针的连接次序实现的。每个结构体都包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

理解:

创建节点:
先创建一个结构体,结构体中一个是数据位一个是指针

struct Node
{int a;                                     // 数据位struct Node* pNext;                           // 地址位
};

写一个c语言的链表记录一下相关推荐

  1. c语言的链表怎么写,写一个C语言的链表记录一下

    #include #include //节点结构体 structNode {int a; //数据位 struct Node* pNext; //地址位 };//全局和局部的区别 struct Nod ...

  2. mysql c测试程序_Linux平台下从零开始写一个C语言访问MySQL的测试程序

    Linux 平台下从零开始写一个 C 语言访问 MySQL 的测试程序 2010-8-20 Hu Dennis Chengdu 前置条件: (1) Linux 已经安装好 mysql 数据库: (2) ...

  3. 手把手教你如下在Linux下如何写一个C语言代码,编译并运行

    文章目录 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 打开Ubuntu终端 创建 helloworld.c 编译C文件 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 ...

  4. 学习较底层编程:动手写一个C语言编译器

    动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可 ...

  5. 如何写一个脚本语言_零基础小白如何学会写文案?文案写作技巧之一:如何写一个吸引读者的文案开头...

    我文笔不好怎样才能够写出优质的文案?很多人都有这个疑问,包括我自己在学习新媒体运营之前,这也是我最大的困惑.现在是内容为王的时代,你的文章质量决定了你的KPI. 后来我学习了文章的写作结构和技巧后,就 ...

  6. 用RPA工具写一个简单的数据汇总记录

    老婆大人的要求是要把4个excel表格的某几行的数据汇总到一个台账中,因为水平实在不行只能用RPA工具写了. 首先弄一个输入界面给她选择,第一个是台账,其他是需要汇总的分表(图片打码位置是公司名所以就 ...

  7. 如何写一个脚本语言_如何写一个Nx schematic plugin?

    前言 玩过Angular的同学都知道Angular作为一个Framework,拥有一套完备的生态,还集成了强大的CLI.而React则仅仅是一个轻量级的Library,官方社区只定义了一套组件的周期规 ...

  8. 手写一个C语言编译器

    记录一个很好的C语言编译器项目地址 手把手教你构建 C 语言编译器(0)- 前言 | 三点水

  9. python是用c 写的吗_我能用python写一个c语言出来吗?

    完全可以 正确的比喻: 空间->白纸; 0,1(计算机底层的二进制表示方案)->黑色笔迹; python -> 韩语相关语法规则; C -> 英语相关语法规则; 请问可以使用韩 ...

最新文章

  1. 550种Blender风格化笔刷素材
  2. python indexerror_python – “IndexError:位置索引器超出范围”,当它们明显没有时
  3. 实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293
  4. 《大道至简》一书第三版,与编辑就本书写作风格的讨论
  5. [.net 面向对象编程基础] (13) 面向对象三大特性——多态
  6. csrf防御 java_一分钟了解【CSRF攻击与防御】
  7. 小蚂蚁学习数据结构(32)——二叉排序树的概念
  8. sql where中用case_从零学会SQL:求职面试题(汇总)
  9. Docker常用操作
  10. 在ubuntu中为程序添加图标快捷键
  11. Yarn 报错:error Couldn‘t publish package: “https://registry.yarnpkg.com/ 。。。Forbidden“
  12. cron linux_如何在Linux中使用cron
  13. android标题白色_Android设置布局背景为白色的三种方法
  14. RK3399Pro Android Rock-X 人工智能开发系列(2)
  15. 2021最新!某盘加速下载工具复活了,无需登录,打开即可高速下载(附下载)!
  16. 2阶魔方矩阵matlab,matlab魔方矩阵
  17. PySide从实战开始学习系列(一)认识PySide
  18. java实现微信网页授权登录
  19. 网页回到顶部 GoTop 按钮自动隐藏
  20. matlab零序五次谐波,基于5次谐波的小电流接地系统故障选线方法仿真与分析.docx...

热门文章

  1. UI设计教程分享:电商网页页面设计常见表现手法
  2. POJ 2299 Ultra-QuickSort(线段树+离散化)
  3. 阿里云四大海外数据中心将开服
  4. topcoder srm 661 div1
  5. 博为峰Java技术文章 ——JavaSE Swing 如何使用进度条组件JProgressBarⅡ
  6. Nginx根据User-Agent适配PC和手机
  7. 获取springmvc中所有的Controller
  8. IOS数组按中文关键字以字母序排序
  9. Scorm标准学习——Scorm RTE API与数据模型
  10. JavaScript遇到浏览器不兼容与解决方案