C语言实现单链表
大二学习数据结构和算法啦,因为之前用Java语言实现过,所以理解起来还是比较轻松,就是理解指针与结构体的运用。废话不多说,上代码!
初始化
typedef struct Node {
int data;
struct Node *next;
} ListNode;
ListNode* InitLink() { //初始化,创建头结点
ListNode *Head = (ListNode*)malloc(sizeof(ListNode));
Head->next = NULL;
return Head;
}
添加
void AddLink(ListNode *Head, int msg) { //添加
ListNode *Tmp = Head, *New;
while(Tmp->next != NULL) {
Tmp = Tmp->next;
}
New = (ListNode*)malloc(sizeof(ListNode));
New->data = msg;
New->next = NULL;
Tmp->next = New;
}
删除(可以按值,也可以按位置)
void Delete(ListNode *Head,int data) {//按值删除
if(Head->next == NULL) {
printf("链表无元素可以删除!");
return;
}
ListNode *pre = Head; //保存上一个结点
ListNode *cur = Head->next;//保存当前结点
while(cur != NULL) {
if(cur->data == data) {
pre->next = cur->next;//上一个结点的下一个等于当前结点的下一个结点
free(cur);//释放结点
return;//结束
}
pre = cur;//前一个结点等于当前结点
cur = cur->next;//当前结点等于下一个结点
}
}
void DeleteMethod(ListNode *head, int element){//按值删除结点
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == element){
pre->next = cur->next;
free(cur);
return;//结束程序
}
pre = cur;
cur = cur->next;
}
}
//index代表删除第几个结点
void DeleteLink(ListNode *Head,int index){//按下标删除
ListNode *Tmp = Head;
ListNode *Old;
int mark = ;
if(index < ){
return;
}
while(mark < index- && Tmp->next != NULL){
Old = Tmp;
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
Old = Tmp->next;
Tmp->next = Old->next;
free(Old);
}
修改(可以按值,也可以按位置)
void UpdataLink(ListNode *head, int oldata, int newdata){//按值修改数据
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == oldata){
cur->data = newdata;
return;//结束程序
}
pre = cur;
cur = cur->next;
}
}
void UpLink(ListNode *Head,int index,int element){//按下标修改
ListNode *Tmp = Head;
int mark = ;
if(index < ){
return;
}
while(mark < index - && Tmp->next != NULL){
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
Tmp->next->data = element;
}
插入(可以按值,也可以按位置)
void InsetrLink(ListNode *head, int oldata, int newdata){//按值输入之前插入
ListNode *New = (ListNode*)malloc(sizeof(ListNode));
New->data = newdata;
New->next = NULL;
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == oldata){
pre->next = New;
New->next = cur;
return;//结束程序
}
pre = cur;
cur = cur->next;
}
}
void InsertLink(ListNode *Head,int index,int element){//按下标插入
ListNode *Tmp = Head;
ListNode *New;
int mark = ;
if(index < ){
return;
}
while(mark < index - && Tmp->next != NULL){
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
New = (ListNode*)malloc(sizeof(ListNode));
New->data = element;
New->next = Tmp->next;
Tmp->next = New;
}
查询(返回一个结点地址)
//提出查找结点方法,其它方法可以调用
//在单链表中查找第index个结点
ListNode* GetNode(ListNode *Head,int index){//查找结点方法
int mark = ;
ListNode *Tmp = Head;
while(Tmp->next && mark < index){//Tmp->next为NULL 或者 mark==index结束
Tmp = Tmp->next;
mark++;
}
if(index == mark){
return Tmp;
}else{
return NULL;
}
}
销毁
void DestoryLink(ListNode *Head) { //销毁链表
ListNode *Tmp;
while(Head->next){
Tmp = Head->next;
Head->next = Tmp->next;
free(Tmp);
}
free(Head);//头都删掉
}
显示
void Display(ListNode *Head) {//显示
ListNode *Tmp = Head->next;
while(Tmp != NULL) {
printf("%d ",Tmp->data);
Tmp = Tmp->next;
}
}
甩上完整代码
#include<stdio.h>
#include<stdlib.h> //Upon开发————2019.9.26
typedef struct Node {
int data;
struct Node *next;
} ListNode; ListNode* InitLink() { //初始化,创建头结点
ListNode *Head = (ListNode*)malloc(sizeof(ListNode));
Head->next = NULL;
return Head;
} void AddLink(ListNode *Head, int msg) { //添加
ListNode *Tmp = Head, *New;
while(Tmp->next != NULL) {
Tmp = Tmp->next;
}
New = (ListNode*)malloc(sizeof(ListNode));
New->data = msg;
New->next = NULL;
Tmp->next = New;
} void Delete(ListNode *Head,int data) {//按值删除
if(Head->next == NULL) {
printf("链表无元素可以删除!");
return;
} ListNode *pre = Head; //保存上一个结点
ListNode *cur = Head->next;//保存当前结点
while(cur != NULL) {
if(cur->data == data) {
pre->next = cur->next;//上一个结点的下一个等于当前结点的下一个结点
free(cur);//释放结点
return;//结束
}
pre = cur;//前一个结点等于当前结点
cur = cur->next;//当前结点等于下一个结点
}
} void DeleteMethod(ListNode *head, int element){//按值删除结点
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == element){
pre->next = cur->next;
free(cur);
return;//结束程序
}
pre = cur;
cur = cur->next;
}
}
void InsetrLink(ListNode *head, int oldata, int newdata){//按值输入之前插入
ListNode *New = (ListNode*)malloc(sizeof(ListNode));
New->data = newdata;
New->next = NULL;
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == oldata){
pre->next = New;
New->next = cur;
return;//结束程序
}
pre = cur;
cur = cur->next;
}
} void UpdataLink(ListNode *head, int oldata, int newdata){//修改数据
ListNode *pre = head;
ListNode *cur = head->next;
while (cur != NULL){
if (cur->data == oldata){
cur->data = newdata;
return;//结束程序
}
pre = cur;
cur = cur->next;
}
}
void InsertLink(ListNode *Head,int index,int element){//按下标插入
ListNode *Tmp = Head;
ListNode *New;
int mark = ;
if(index < ){
return;
}
while(mark < index - && Tmp->next != NULL){
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
New = (ListNode*)malloc(sizeof(ListNode));
New->data = element;
New->next = Tmp->next;
Tmp->next = New;
}
void UpLink(ListNode *Head,int index,int element){//按下标修改
ListNode *Tmp = Head;
int mark = ;
if(index < ){
return;
}
while(mark < index - && Tmp->next != NULL){
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
Tmp->next->data = element;
}
//index代表删除第几个结点
void DeleteLink(ListNode *Head,int index){//按下标删除
ListNode *Tmp = Head;
ListNode *Old;
int mark = ;
if(index < ){
return;
}
while(mark < index- && Tmp->next != NULL){
Old = Tmp;
Tmp = Tmp->next;
mark++;
}
while(Tmp->next == NULL){
return;
}
Old = Tmp->next;
Tmp->next = Old->next;
free(Old);
}
//提出查找结点方法,其它方法可以调用
//在单链表中查找第index个结点
ListNode* GetNode(ListNode *Head,int index){//查找结点方法
int mark = ;
ListNode *Tmp = Head;
while(Tmp->next && mark < index){//Tmp->next为NULL 或者 mark==index结束
Tmp = Tmp->next;
mark++;
}
if(index == mark){
return Tmp;
}else{
return NULL;
}
}
void InsertList(ListNode *Head,int data,int index){//按下标插入
ListNode *Tmp = GetNode(Head,index - ),*New;
if(Tmp == NULL){
return;
}
New = (ListNode*)malloc(sizeof(ListNode));
New->data = data;
New->next = Tmp->next;
Tmp->next = New;
}
void DeleteList(ListNode *Head,int index){//按下标删除
ListNode *Tmp = GetNode(Head,index - ),*New;
if(Tmp == NULL || Tmp->next == NULL){
return;
}
New = Tmp->next;
Tmp->next = New->next;
free(New);
}
void Display(ListNode *Head) {//显示
ListNode *Tmp = Head->next;
while(Tmp != NULL) {
printf("%d ",Tmp->data);
Tmp = Tmp->next;
}
} void DestoryLink(ListNode *Head) { //销毁链表
ListNode *Tmp;
while(Head->next){
Tmp = Head->next;
Head->next = Tmp->next;
free(Tmp);
}
free(Head);//头都删掉
} int main() {
ListNode *Head = InitLink();
AddLink(Head,);
AddLink(Head,);
AddLink(Head,);
AddLink(Head,);
AddLink(Head,); UpdataLink(Head,,);
Display(Head);
return ;
}
C语言实现单链表的更多相关文章
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
- C语言实现单链表(不带头结点)节点的插入
对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...
- C语言实现单链表(带头节点)
C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
随机推荐
- python-进程、线程与协程
基础概念 进程 是一个执行中的程序,即将程序装载到内存中,系统为它分配资源的这一过程.进程是操作系统资源分配的基本单位. 每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text regio ...
- 上传base64图片到七牛云前端遇到的坑
介意前端普通引入七牛云SDk上传图片到七牛云需要多个js,所以才有了base64的上传方式,简化操作,(懒.) 七牛云官方文档如下 https://developer.qiniu.com/kodo/k ...
- javaScript事件--事件流
一.事件 事件是文档或者浏览器窗口中发生的,特定的交互瞬间. 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字. 事件是javaScript和DOM之间交 ...
- day2计算机基础作业题
1.什么是编程? 编程就是程序员用某种编程语言的语法格式将将自己脑中想让计算机做的事情写成文件.所以编程的结果就是一堆的文件,一堆文件就是的程序. 2.计算机的组成: 1).CPU 其中CPU又分为控 ...
- 013:URL传参数
URL传参数有两种方式: 1.采用在URL中使用变量的方式:在path的第一个参数中,使用'<参数名>'的方式可以传递参数,然后在对于的视图函数中也要写一个参数,并且视图函数中的参数名和U ...
- 【GDOI2017模拟12.9】最近公共祖先
题目 分析 首先,将这些节点按dfs序建一棵线段树. 因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置. 发现,对于一个位置x,它的权值只会对以x为根的子树造成影响. 当修改x时,用w[x ...
- 【NOIP2012模拟10.25】剪草
题目 有N棵小草,编号0至N-1.奶牛Bessie不喜欢小草,所以Bessie要用剪刀剪草,目标是使得这N棵小草的高度总和不超过H.在第0时刻,第i棵小草的高度是h[i],接下来的每个整数时刻,会依次 ...
- 22.从上往下打印二叉树(python)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom( ...
- 使用webuploader组件实现大文件分片上传,断点续传
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- YOLO_V2
YOLOv2:代表着目前业界最先进物体检测的水平,它的速度要快过其他检测系统(FasterR-CNN,ResNet,SSD),使用者可以在它的速度与精确度之间进行权衡. YOLO9000:这一网络结构 ...