一.链表的创建操作

//    操作系统 win 8.1
// 编译环境 Visual Stuido 2017 #include<stdio.h>
#include<malloc.h>
#include<stdlib.h> typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义
// 链表节点的定义
typedef struct ListNode {
ElementType Element; // 数据域,存放数据
ListNode* Next; // 指向下一个链表节点
}Node, *PNode; // 链表创建函数定义
PNode CreateList(void) {
int len ; // 用于定义链表长度
int val ; // 用于存放节点数值
PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间
//头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点)
if (PHead == NULL) // 判断是否分配成功
{
printf("空间分配失败 \n");
exit(-);
} PNode PTail = PHead; // 链表的末尾节点,初始指向头节点
PTail->Next = NULL; // 最后一个节点指针置为空
printf("请输入节点个数:");
scanf_s("%d", &len); // 输入节点个数
for (int i = ; i < len; i++) { PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一个新节点
if (pNew == NULL) {
printf("分配新节点失败\n");
exit(-);
}
printf("请输入第 %d 个节点的数据:", i + );
scanf_s("%d", &val); // 输入链表节点的数据 pNew->Element = val; // 把数据赋值给节点数据域
PTail->Next = pNew; // 末尾节点指针指向下一个新节点
pNew->Next = NULL; // 新节点指针指向为空
PTail = pNew; // 将新节点复制给末尾节点
}
printf("创建链表成功\n");
return PHead; // 返回头节点
} // 主函数
int main() {
PNode List = CreateList(); //创建一个指针,使其指向新创建的链表的头指针
return ;
}

运行结果

二.链表的遍历操作

//    定义链表遍历函数
void TraverseList(PNode List) {
PNode P = List->Next; // 首节点赋值给临时节点P
printf("遍历链表的值为:");
if (P == NULL)
printf("链表为空");
while (P != NULL) //当临时节点P不为尾节点时,输出当前节点值
{
printf("%d ", P->Element);
P = P->Next;
}
printf("\n");
}

三.链表的查询操作

//    定义链表查询函数
PNode FindList(PNode List) {
PNode P = List->Next; // 定义临时指针P指向首节点的地址
int num = ; // 用于记录链表节点位置
int val = ; // 用于存放要查询的值
printf("请输入要查询的数:");
scanf_s("%d", &val); // 输入要查询的数值
while (P != NULL&&P->Element != val) {
P = P->Next;
++num;
}
if (P != NULL)
printf("找到的节点为:%d", num + );
else
printf("找不到该节点");
printf("\n");
return P;
}

四.链表的插入操作

//     定义链表插入函数
// 在链表位置第pos节点前插入包含数据val的节点
void InsertList(PNode List, int pos, int val) {
int position = ;
PNode P = List; // 定义节点p指向头节点
// 寻找pos节点的前驱结点
while (P != NULL&&position<pos - )
{
P = P->Next;
++position;
}
PNode Tmp = (PNode)malloc(sizeof(Node)); // 分配一个临时节点用来存储要插入的数据
if (Tmp == NULL)
{
printf("内存分配失败!");
exit(-);
}
// 插入节点
Tmp->Element = val;
Tmp->Next = P->Next;
P->Next = Tmp;
}

五.链表的删除操作

删除整个链表操作

//定义删除整个链表函数
void DeleteTheList(PNode List) {
PNode P, Tmp;
P = List->Next; //定义指针P指向链表要删除的链表List的第一个点节点
List->Next = NULL;
while (P != NULL) {
Tmp = P->Next; //临时Tmp指向要删除的节点的下个节点
free(P); //释放指针P指向的节点
P = Tmp; //重新赋值
}
printf("删除链表成功!\n");
}

删除链表中的元素

//   定义删除链表元素函数
// 删除链表中的第pos节点
void DeleteList(PNode List, int pos) {
int position = ;
PNode P = List; // 定义一个指针p指向链表头节点
// 寻找pos节点位置的前驱节点
while (P != NULL&&position < pos - ) {
P = P->Next;
++position;
} // 删除节点
PNode Tmp = P->Next; // 定义临时指针Tmp指向要删除的节点
P->Next = Tmp->Next; // 使要删除节点的前驱结点指向其后驱节点
free(Tmp); // 释放删除节点的内存空间,防止内存泄漏
Tmp = NULL; // 使q指向空指针,防止产生野指针
}

六.完整代码实现

//    操作系统 win 8.1
// 编译环境 Visual Stuido 2017 #include<stdio.h>
#include<malloc.h>
#include<stdlib.h> typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义
// 链表节点的定义
typedef struct ListNode {
ElementType Element; // 数据域,存放数据
ListNode* Next; // 指向下一个链表节点
}Node, *PNode; // 函数声明
PNode CreateList(void); // 声明创建链表函数
void TraverseList(PNode List); // 声明遍历链表函数
void InsertList(PNode List, int pos, int val); // 声明链表插入函数
void DeleteTheList(PNode List); // 声明删除整个链表函数
void DeleteList(PNode List, int pos); // 声明删除链表元素函数
PNode FindList(PNode List); // 声明链表查询函数 // 主函数
int main() {
PNode List = CreateList(); // 创建一个指针,使其指向新创建的链表的头指针
TraverseList(List); // 遍历链表
FindList(List); // 链表查询
InsertList(List, , ); // 链表插入,在第三个位置插入数值100
TraverseList(List);
DeleteList(List, ); // 删除链表第三个节点
TraverseList(List);
DeleteTheList(List); // 删除整个链表
TraverseList(List);
return ;
} // 创建链表函数定义
PNode CreateList(void) {
int len ; // 用于定义链表长度
int val ; // 用于存放节点数值
PNode PHead = (PNode)malloc(sizeof(Node)); // 创建分配一个头节点内存空间
if (PHead == NULL) // 判断是否分配成功
{
printf("空间分配失败 \n");
exit(-);
} PNode PTail = PHead; // 链表的末尾节点,初始指向头节点
PTail->Next = NULL; // 最后一个节点指针置为空
printf("请输入节点个数:");
scanf_s("%d", &len); // 输入节点个数
for (int i = ; i < len; i++) { PNode PNew = (PNode)malloc(sizeof(Node)); // 分配一个新节点
if (PNew == NULL) {
printf("分配新节点失败\n");
exit(-);
}
printf("请输入第 %d 个节点的数据:", i + );
scanf_s("%d", &val); // 输入链表节点的数据 PNew->Element = val; // 把数据赋值给节点数据域
PTail->Next = PNew; // 末尾节点指针指向下一个新节点
PNew->Next = NULL; // 新节点指针指向为空
PTail = PNew; // 将新节点复制给末尾节点
}
printf("创建链表成功\n");
return PHead; // 返回头节点
} // 定义链表遍历函数
void TraverseList(PNode List) {
PNode P = List->Next; // 首节点赋值给临时节点P
printf("遍历链表的值为:");
if (P == NULL)
printf("链表为空");
while (P != NULL) //当临时节点P不为尾节点时,输出当前节点值
{
printf("%d ", P->Element);
P = P->Next;
}
printf("\n");
} // 定义链表查询函数
PNode FindList(PNode List) {
PNode P = List->Next; // 定义临时指针P指向首节点的地址
int num = ; // 用于记录链表节点位置
int val = ; // 用于存放要查询的值
printf("请输入要查询的数:");
scanf_s("%d", &val); // 输入要查询的数值
while (P != NULL&&P->Element != val) {
P = P->Next;
++num;
}
if (P != NULL)
printf("找到的节点为:%d", num + );
else
printf("找不到该节点");
printf("\n");
return P;
}
// 定义链表插入函数
// 在链表位置第pos节点前插入包含数据val的节点
void InsertList(PNode List, int pos, int val) {
int position = ;
PNode P = List; // 定义节点p指向头节点
// 寻找pos节点的前驱结点
while (P != NULL&&position<pos - )
{
P = P->Next;
++position;
}
PNode Tmp = (PNode)malloc(sizeof(Node)); // 分配一个临时节点用来存储要插入的数据
if (Tmp == NULL)
{
printf("内存分配失败!");
exit(-);
}
// 插入节点
Tmp->Element = val;
Tmp->Next = P->Next;
P->Next = Tmp;
} //定义删除整个链表函数
void DeleteTheList(PNode List) {
PNode P, Tmp;
P = List->Next; //定义指针P指向链表要删除的链表List的第一个点节点
List->Next = NULL;
while (P != NULL) {
Tmp = P->Next; //临时Tmp指向要删除的节点的下个节点
free(P); //释放指针P指向的节点
P = Tmp; //重新赋值
}
printf("删除链表成功!\n");
}
// 定义删除链表元素函数
// 删除链表中的第pos节点
void DeleteList(PNode List, int pos) {
int position = ;
PNode P = List; // 定义一个指针p指向链表头节点
// 寻找pos节点位置的前驱节点
while (P != NULL&&position < pos - ) {
P = P->Next;
++position;
} // 删除节点
PNode Tmp = P->Next; // 定义临时指针Tmp指向要删除的节点
P->Next = Tmp->Next; // 使要删除节点的前驱结点指向其后驱节点
free(Tmp); // 释放删除节点的内存空间,防止内存泄漏
Tmp = NULL; // 使q指向空指针,防止产生野指针
}

运行结果

C语言描述链表的实现及操作的更多相关文章

  1. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  2. C语言描述队列的实现及操作(链表实现)

    // 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...

  3. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  4. C语言描述栈的实现及操作(数组实现)

    一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...

  5. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  6. 【数据结构】之链表(C语言描述)

    链表是线性表的一种,是一种物理存储单元上非连续的存储结构,链表中的数据元素之间是通过指针链接实现的. 链表由一系列节点组成,节点可以在运行时动态的生成. 链表中国的每个节点分为两部分:一部分是存储数据 ...

  7. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  8. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  9. 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构

    数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...

随机推荐

  1. vxWorks6.6 N270 D525 cpu的bsp配置总结

    对硬盘的操作 使用SATA硬盘,分区,引导区(VxC:)必须格式化为FAT(FAT16)格式,所以该分区大小有限制,不能超过4G(4G大小带测试),设置C:为"活动的": 主机上安 ...

  2. Linux显示一行显示列总计

    Linux显示一行显示列总计 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -t total used free shared buffers ca ...

  3. JS原生代码实现导航高亮

    一 实现原理 根据当前页面滚动条的高度判断当前页面应当与导航栏中哪个导航相关联,并对相应的导航设置高亮样式. 二 代码解析 先简单写一个页面顶端的导航栏:<nav>  <ul> ...

  4. 小白学爬虫-在无GUI的CentOS上使用Selenium+Chrome

    爬虫代理IP由芝麻HTTP服务供应商提供各位小伙伴儿的采集日常是不是被JavaScript的各种点击事件折腾的欲仙欲死啊?好不容易找到个Selenium+Chrome可以解决问题! 但是另一个▄█▀█ ...

  5. 最小生成树 TOJ 4117 Happy tree friends

    链接http://acm.tju.edu.cn/toj/showp4117.html 4117.   Happy tree friends Time Limit: 1.0 Seconds   Memo ...

  6. 关于jquery插件模板的两个案例

    /** * jquery tips 提示插件 jquery.tips.js v0.1beta * * 使用方法 * $(selector).tips({ //selector 为jquery选择器 * ...

  7. C# Hook原理及EasyHook简易教程

    前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实际上,Windows平台是基于事件驱动机制的, ...

  8. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

  9. [CF908D]New Year and Arbitrary Arrangement

    题面在这里 题意 给定三个数\(k,pa,pb\),每次有\(\frac{pa}{pa+pb}\)的概率往后面添加一个'\(a\)',每次有\(\frac{pb}{pa+pb}\)的概率往后面添加一个 ...

  10. [USACO12FEB]Nearby Cows

    题意 给出一棵n个点的无根树,每个点有权值,问每个点向外不重复经过k条边的点权和 题解 设f[i][j]表示所有离i节点距离为j的点权和,v为它周围相邻的点,t为v的个数,则 j > 2 f[i ...