链表的操作增删改查

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语言动态链表数据结构的更多相关文章

  1. C语言动态链表数据结构实现的学生信息项目

    注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...

  2. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  3. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...

  4. [数据结构】【c语言】链表的创建和遍历

    第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...

  5. 1. C语言中的数据结构.md

    C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...

  6. HDU 2095 find your present (2) 动态链表

    解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...

  7. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  8. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

  9. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

随机推荐

  1. 比较两种方式的form请求提交

    [一]浏览器form表单提交 表单提交, 适用于浏览器提交.像常见的pc端的网银支付,用户在商户商城购买商品,支付时商家系统把交易数据通过form表单提交到三方支付网关,然后用户在三方网关页面完成支付 ...

  2. POJ 2752 Seek the Name,Seek the Fame(KMP,前缀与后缀相等)

    Seek the Name,Seek the Fame 过了个年,缓了这么多天终于开始刷题了,好颓废~(-.-)~ 我发现在家真的很难去学习,因为你还要陪父母,干活,做家务等等 但是还是不能浪费时间啊 ...

  3. composer----------composer基本命令和遇到一些问题解决方案

    1.composer跟xdebug有冲突,每次用composer命令的时候都要报xdebug的错误,去php的配置文件里面将xdebug注释掉就可以了,但是我注释掉了以后还是不行.找了半天才看到,我用 ...

  4. Monogdb 按2个字段值之间的比较

    使用 $where BsonDocument query = new BsonDocument("$where", "this.soDate<this.pEffDa ...

  5. Oracle数据库分区相干知识点

    Partition Characteristics:1.Partition Key;2.Partitioning Strategies Partitioning Strategies:1. range ...

  6. Git-分支的建立与合并

    举一个实际工作中可能会遇到的分支建立与合并的例子: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照 ...

  7. JavaScript三种判断语句和三元运算符

    三种判断语句 1.if结构 语法:if(条件){条件满足时执行的代码块} 2.if else结构 语法:if(条件){条件满足时执行的代码块}   else{条件不满足时执行的代码块} 3.if el ...

  8. codeforces 957 A. Tritonic Iridescence

    题意: 给出一个字符串,要求任意两个相同的字母不能相同,问这个字符串是否能有两种或者两种以上的表现形式. 思路: 简单判断一下: 1.问号在端点: 2.连续两个问号或者以上: 3.一个问号两端的字母是 ...

  9. .net nancy

    官网 文档 入门教程 参考

  10. 【Redis学习之五】Redis数据类型:列表和散列

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...