写一个c语言的链表记录一下
先上代码:
#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语言的链表记录一下相关推荐
- c语言的链表怎么写,写一个C语言的链表记录一下
#include #include //节点结构体 structNode {int a; //数据位 struct Node* pNext; //地址位 };//全局和局部的区别 struct Nod ...
- mysql c测试程序_Linux平台下从零开始写一个C语言访问MySQL的测试程序
Linux 平台下从零开始写一个 C 语言访问 MySQL 的测试程序 2010-8-20 Hu Dennis Chengdu 前置条件: (1) Linux 已经安装好 mysql 数据库: (2) ...
- 手把手教你如下在Linux下如何写一个C语言代码,编译并运行
文章目录 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 打开Ubuntu终端 创建 helloworld.c 编译C文件 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 ...
- 学习较底层编程:动手写一个C语言编译器
动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可 ...
- 如何写一个脚本语言_零基础小白如何学会写文案?文案写作技巧之一:如何写一个吸引读者的文案开头...
我文笔不好怎样才能够写出优质的文案?很多人都有这个疑问,包括我自己在学习新媒体运营之前,这也是我最大的困惑.现在是内容为王的时代,你的文章质量决定了你的KPI. 后来我学习了文章的写作结构和技巧后,就 ...
- 用RPA工具写一个简单的数据汇总记录
老婆大人的要求是要把4个excel表格的某几行的数据汇总到一个台账中,因为水平实在不行只能用RPA工具写了. 首先弄一个输入界面给她选择,第一个是台账,其他是需要汇总的分表(图片打码位置是公司名所以就 ...
- 如何写一个脚本语言_如何写一个Nx schematic plugin?
前言 玩过Angular的同学都知道Angular作为一个Framework,拥有一套完备的生态,还集成了强大的CLI.而React则仅仅是一个轻量级的Library,官方社区只定义了一套组件的周期规 ...
- 手写一个C语言编译器
记录一个很好的C语言编译器项目地址 手把手教你构建 C 语言编译器(0)- 前言 | 三点水
- python是用c 写的吗_我能用python写一个c语言出来吗?
完全可以 正确的比喻: 空间->白纸; 0,1(计算机底层的二进制表示方案)->黑色笔迹; python -> 韩语相关语法规则; C -> 英语相关语法规则; 请问可以使用韩 ...
最新文章
- 550种Blender风格化笔刷素材
- python indexerror_python – “IndexError:位置索引器超出范围”,当它们明显没有时
- 实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293
- 《大道至简》一书第三版,与编辑就本书写作风格的讨论
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
- csrf防御 java_一分钟了解【CSRF攻击与防御】
- 小蚂蚁学习数据结构(32)——二叉排序树的概念
- sql where中用case_从零学会SQL:求职面试题(汇总)
- Docker常用操作
- 在ubuntu中为程序添加图标快捷键
- Yarn 报错:error Couldn‘t publish package: “https://registry.yarnpkg.com/ 。。。Forbidden“
- cron linux_如何在Linux中使用cron
- android标题白色_Android设置布局背景为白色的三种方法
- RK3399Pro Android Rock-X 人工智能开发系列(2)
- 2021最新!某盘加速下载工具复活了,无需登录,打开即可高速下载(附下载)!
- 2阶魔方矩阵matlab,matlab魔方矩阵
- PySide从实战开始学习系列(一)认识PySide
- java实现微信网页授权登录
- 网页回到顶部 GoTop 按钮自动隐藏
- matlab零序五次谐波,基于5次谐波的小电流接地系统故障选线方法仿真与分析.docx...