C语言动态链表数据结构
链表的操作增删改查
typedef int DATA; struct SNode
{
DATA data;
SNode* pNext;
}; SNode* g_head=NULL;//全局变量 //从头部添加
void AddHead(DATA nNum)
{
SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
//SNode* p = new SNode;//C++ 方式
p->data = nNum;
p->pNext = g_pHead; g_pHead = p;
} //从尾部添加
void AddTail(DATA nNum)
{
SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
pNew->data = nNum;
pNew->pNext = NULL; if (!g_pHead)
{
g_pHead = pNew;
return;
} SNode* p = g_pHead;
SNode* p1 = NULL;
while (p)
{
p1 = p;
p= p->pNext;
} //跳出循环时,p1记录的时最后一个节点,让最后一个节点的pNext指向新创建的节点
p = p1;
p->pNext = pNew; //另一种写法
//while(p->pNext != NULL)//循环遍历,当下一个节点为空说明到尾部了
// p=p->pNext;
//p->pNext = pNew;
} //找到,返回找节点位置;失败返回-1
int FindNodeIndex(DATA nNum)
{
SNode* p = g_pHead;
int i =;
while(p)
{
if (p->data == nNum)
{
return i;
} p = p->pNext;
++i;
} return -;
} //删除成功返回-1;失败返回0
int DeleteNode(DATA nNum)
{
SNode* p = g_pHead;
SNode* p1 = NULL;//记录前一个节点 if (p == NULL)//当前链表为空
{
return -;
} //头节点没有前一个节点,要特殊处理
if (p->data == nNum)
{
g_pHead = p->pNext;
delete p;
return ;
}
while(p)
{
if (p->data == nNum)
{
//删除当前节点时,让当前节点的前一个节点的pNext指向当前节点的后一个节点
p1->pNext = p->pNext;
delete p;
return ;
}
p1= p;//记录前节点
p = p->pNext;
} return -;
} //修改指定节点的值
void ModifyNode(DATA oldNum,DATA newNum)
{
SNode* p = g_pHead;
while(p)//
{
if (p->data == oldNum)
{
p->data = newNum;
}
p = p->pNext;
}
} //打印所有节点
void PrintALL()
{
SNode* p = g_pHead;
if (p == NULL)
{
printf("当前链表为空\n");
return;
}
while(p)//
{
printf("%d\n",p->data);
p = p->pNext;
}
} //成功返回0;失败返回-1
int FindNode(DATA nNum)
{
SNode* p = g_pHead;
while (p)
{
if (p->data == nNum)
{
return ;
} p=p->pNext;
}
return -;
} //在某个节点之后插入新节点;成功返回0;失败返回-1
int InsertNode(DATA npos,DATA nNum)
{
SNode* pNew = new SNode;//C++ 方式
pNew->data = nNum;
pNew->pNext = NULL; SNode* p = g_pHead; //if (p->data == npos)//头结点
//{
// pNew->pNext=p->pNext;//头节点指向的下一个节点指针放到新节点的pNext
// p->pNext=pNew;//头节点pNext指向新节点 // return 0;
//} while(p)
{
if (p->data == npos)
{
pNew->pNext = p->pNext;
p->pNext=pNew; return ;
}
p = p->pNext;
} return -;
} void DeleteAll()
{
SNode* p = g_pHead;
SNode* p1 = NULL;
while(p)
{
p1=p;
p= p->pNext; delete p1;
} g_pHead = NULL;
} int main()
{
DeleteNode();//链表为空的时候,删除要加判断 lAddHead();
lAddHead();
AddHead();
puts("修改前");
PrintALL();
ModifyNode(,-);
puts("修改后");
lPrintALL(); int i = FindNodeIndex(-);
if (i >= )
{
cout << "第" << i+ << "个节点找到" <<endl;
} //删除节点
i = DeleteNode();//头部删除要特殊处理
if (i == )
{
cout << "删除节点成功!" << endl;
}
else
{
cout << "删除节点失败!" << endl;
}
PrintALL(); puts("尾部添加");
AddTail();
PrintALL(); //修改节点
ModifyNode(-,);
puts("插入节点3");
//插入节点
i = list.InsertNode(,); list.PrintALL(); puts("清空链表");
DeleteAll();
PrintALL();
return ;
}
1.头部插入

2.尾部插入

3.在指定节点位置后面插入新节点
例如:在节点2后面插入新节点4

中间插入新节点4,让节点2的pNext赋值给新节点4的pNext,然后让新节点4的地址赋值给节点2的pNext
4.删除节点

注意:如果删除的是头节点,要特殊处理,因为头节点没有前面的节点,所以头节点的pNext赋值给g_head;
C语言动态链表数据结构的更多相关文章
- C语言动态链表数据结构实现的学生信息项目
注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List
C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...
- [数据结构】【c语言】链表的创建和遍历
第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...
- 1. C语言中的数据结构.md
C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...
- HDU 2095 find your present (2) 动态链表
解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...
- 关于c语言单项链表尾添加
犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
随机推荐
- Oracle 23的用户管理
创建用户的语法格式 Create user <user_name> Identified by<password> Default tabespace<default t ...
- netframework转core时文件响应流问题
做将framework webapi项目转成netcore平台上的webapi项目时,发现原来的返回文件响应流在netcore平台下失效.代码如下,返回pdf文件响应流,供前端显示 /// <s ...
- Vue系列之 => 结合ajax完成列表增删查
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 针对IE6,IE7,IE8,IE9,FF等不同浏览器的CSS写法
首先我们介绍一下HACK原理,就是不同浏览器对字符的识别不同 在 CSS中常用特殊字符识别表: (1)*: IE6+IE7都能识别*,而标准浏览器FF+IE8是不能识别*的; (2)!importan ...
- html5-css列表和表格
td{ /*width: 150px; height: 60px;*/ padding: 10px; text-align: center;} table{ width ...
- html5-output的用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Python pyodbc安装
1)下面这个链接找个适合自己python版本的文件下载下来 https://pypi.org/project/pyodbc/#files 2)放到scripts下面 3) 在scripts路径上输入c ...
- python 解码json数据并在一个OrderdDict中保留其顺序
一般来讲,JSON 解码会根据提供的数据创建dicts 或lists.如果你想要创建其他类型的对象,可以给json.loads() 传递object_pairs_hook 或object_hook 参 ...
- Linux基础命令---管理组gpasswd
gpasswd gpasswd指令用来管理组文件“/etc/group”和“/etc/gshadow”,每个组可以设置管理员.组员.密码.系统管理员可以使用-A选项定义组管理员,使用-M选项定义成员. ...
- 什么是Satoshi?和比特币中本聪有什么关系?
Satoshi Nakamoto(中本聪)是发起比特币和原始比特币客户端创建者.不过,我经常听到“Satoshi ”这个词,好像它是一个货币单位. 什么是Satoshi呢?Satoshi是0.0000 ...