对于c语言的单链表来说,应该是数据结构中比较简单的一类结构,我们只要认识链表结构,对指针和结构体掌握好,其实编写代码并不算太难。

链表结构:

对于链表中的每一个结点,我们可以定义如下的结构体:

 基本操作:

1.创造结点:

为新节点newnode动态开辟一块空间,结点值为x,指针域指向NULL

2.头插结点:

在进行头插元素的时候,第一步和第二步不能进行交换,如果先进pre->next=s,此时pre->next指向了s,在进行s->next=pre->next,就会使s->next指向自己本身,无法达到预期效果

3.头删结点:

 直接将头指针指向原来指向的下一个位置,即pplist->next=cur->next

4.尾插:

当链表为空时,直接将pplist指针指向这个新结点即可;当链表不为空时,则需循环遍历链表,找到链表中最后一个结点,然后将其的next域指向新节点,即cur->next=newnode,此时,不需要将新节点的next域赋值为空,因为在创建结点函数中已将next域赋值为空

5.尾删:

当链表中只有一个结点时候,直接将其free掉;当链表中有多个结点时,用俩个指针依次向后遍历,直到快指针的next为空,此时慢指针指向链表中倒数第二个节点,直接将其指向空即可。

5.任意位置后插入元素:

给定一个位置pos,在其后面插入新节点,这种情况与头插法类似,只是在链表中间进行头插,只需要按照头插法的方法即可。

6.任意位置后删除元素:

对于这种情况,同样是给定一个位置,如果此位置为空或者它的next为空,则无法删除,直接返回;如果给定位置正常,则直接将给定位置的next指向,给定位置的next的next。

7.查找元素:

在查找元素的时候,只需遍历一遍链表,找到链表当中值与要查找的值相同的结点,并返回(注意,链表中各节点值不相同)。

完整代码: 

SList.h#pragma once
typedef int DateType;
typedef struct SListNode
{DateType data;struct SListNode* next;
}SListNode;// 动态申请一个结点
SListNode* BuySListNode(DateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, DateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, DateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, DateType x);
// 单链表在pos位置之后插入x
SListNode* SListInsertAfter(SListNode* pos, DateType x);
// 单链表删除pos位置之后的值
SListNode* SListEraseAfter(SListNode* pos);
//销毁单链表
void SListDestory(SListNode** pplist);
//统计链表元素个数
int SListSize(SListNode* plist);void Test();
SList.c#include"SList.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//创造结点
SListNode* BuySListNode(DateType x)
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));if (newnode == NULL){exit(0);}newnode->data = x;newnode->next = NULL;return newnode;
}
//尾插
void SListPushBack(SListNode** pplist, DateType x)
{assert(pplist != NULL);if (NULL == *pplist){*pplist = BuySListNode(x);}else{// pplist的链表不为空// 1. 找到原链表中的最后一个节点SListNode* cur = *pplist;while (cur->next){cur = cur->next;}// 2. 插入新节点cur->next = BuySListNode(x);}
}
//尾删
void SListPopBack(SListNode** pplist)
{assert(pplist != NULL);//1.链表中午结点if (NULL == *pplist)return;else if (NULL == (*pplist)->next){// 2. 链表中只有一个节点free(*pplist);*pplist = NULL;}else{// 3. 链表中有多个节点(至少是2个)// a. 找到最后一个节点并保存其前一个节点SListNode* cur = *pplist;SListNode* prev = NULL;   // 保存cur的前一个节点while (cur->next){prev = cur;cur = cur->next;}// cur是最后一个节点   prev刚好是cur的前一个free(cur);prev->next = NULL;/*方法二:1. 找到链表倒数第二个节点while(cur->next->next){cur = cur->next;}// 2. 删除最后一个节点;cur刚好是最后一个节点的前一个节点free(cur->nexr);cur->next = NULL;*/}}
//头插
void SListPushFront(SListNode** pplist, DateType x)
{assert(pplist != NULL);//创造一个新结点SListNode* newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;}
//头删
void SListPopFront(SListNode** pplist)
{assert(pplist != NULL);if (*pplist == NULL){printf("链表为空!!!\n");return;}else{SListNode* cur = *pplist;*pplist = cur->next;free(cur);cur = NULL;}
}
SListNode* SListInsertAfter(SListNode* pos, DateType x)
{if (pos){return;}SListNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}
SListNode* SListEraseAfter(SListNode* pos)
{if (pos||pos->next){return;}SListNode* p = pos->next;pos->next = p->next;free(p);p = NULL;
}
//查找元素
SListNode* SListFind(SListNode* plist, DateType x)
{SListNode* cur = plist;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
//统计链表的元素个数
int SListSize(SListNode* plist)
{SListNode* cur = plist;int count = 0;while (cur){count++;cur = cur->next;}return count;
}
//销毁链表
void SListDestory(SListNode** pplist)
{assert(pplist != NULL);SListNode* cur = *pplist;while (cur){*pplist = cur->next;free(cur);cur = *pplist;}*pplist = NULL;
}
//打印单链表
void SListPrint(SListNode* plist)
{SListNode* p = plist;while (p != NULL){printf("%d---->", p->data);p = p->next;}printf("NULL\n");
}void Test()
{SListNode* s =NULL;SListPushBack(&s,1);SListPushBack(&s, 2);SListPushBack(&s, 3);SListPushBack(&s, 4);SListPushBack(&s, 5);SListPopBack(&s);SListPushFront(&s, 4);SListPushFront(&s, 3);SListPushFront(&s, 2);SListPushFront(&s, 1);SListPrint(s);int num=SListSize(s);printf("\nnum=%d\n", num);SListDestory(&s);
}
SList_Main.c#include"SList.h"int main()
{Test();return 0;
}

c语言 链表基本操作相关推荐

  1. c语言建立链表叫LNode,C语言链表基本操作

    链表的建立.插入.查找.倒置.删除等操作 //链表操作:建立.插入.删除.查找.倒置.删除等基本操作 //喜洋洋制作 #include #include typedefstructLNode { in ...

  2. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  3. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  4. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  5. C语言实现单链表基本操作

    C语言实现单链表基本操作的 目录

  6. C语言SQLite3基本操作Demo

    /*************************************************************************** C语言SQLite3基本操作Demo* 声明: ...

  7. c语言链表ppt,C语言链表及链表上机题.ppt

    C语言链表及链表上机题 第13讲 链表 链表概述(1) 所谓链表是指若干个数据项(每个数据项称为一个"结点")按一定的原则连接起来.每个数据项都包含有若干个数据和一个指向下一个数据 ...

  8. c语言链表ppt,C语言链表ppt课件.ppt

    C语言链表ppt课件.ppt 第十一章 链表,1,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻两结点间用一 ...

  9. [转载 整理]C语言链表实例

    C语言链表有单链表.双向链表.循环链表.单链表由数据域和指针域组成,数据域存放数据,指针域存放该数据类型的指针便于找到下一个节点.双链表则含有头指针域.数据域和尾指针域,域单链表不同,双链表可以从后一 ...

最新文章

  1. UCL葡萄酒(red white wine quality)数据集字段解释、数据导入实战
  2. android权限控制泄露,Android应用的权限泄露分析
  3. 谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 搜狐科技 10-12 15:29 选自:Google Research Blog 参与:李泽南、
  4. clover configurator_枯木逢春,用Clover让老电脑从NVME SSD启动 再用叁年没问题
  5. jmeter constant timer 如何添加_阿里巴巴在开源压测工具 JMeter 上的实践和优化
  6. LeetCode 1832. 判断句子是否为全字母句
  7. Spring根据包名获取包路径下的所有类
  8. 实战系列-Spring Cloud微服务中三把利器Feign、Hystrix、Ribbon
  9. android透明状态栏刘海屏,Android 修改dialog状态栏颜色兼容刘海屏
  10. 使用 做签名的post_使用 Go 添加 JWT 认证
  11. 简谈几种常用的库函数
  12. 【搬运】 Cadence orcad常用库olb介绍
  13. 微型计算机与微处理器的区别,微处理器是cpu吗?微处理器和cpu的区别
  14. 个人网站建设专业定制,个人网站建设怎么做
  15. 微信 云端搭建小程序概述
  16. 两平面平行但不重合的条件是_____怎样证明平行
  17. Cookie被禁用,如何传递session id?
  18. 解决 Android Bitmap 合成图片时 PNG透明背景 为黑色的问题
  19. 手游服务器被ddos攻击要怎么解决?
  20. MySQL数据库基础操作

热门文章

  1. find命令基本用法详解
  2. 临摹图标都有哪些技巧,五个临摹图标案例告诉你
  3. linux 基础 --04-07
  4. 基于位置的服务器,用于基于位置的服务的移动台-服务器协议
  5. 麦当劳LEED认证餐厅超过1600家;玩具反斗城国庆全国新开6家门店 | 美通企业日报...
  6. 日系服装搭配出甜美与性感
  7. 00942 ora 表存在_ORA-00942:写入数据库中的表时,表或视图不存在错误
  8. 分布式系列之开源分布式存储技术分析
  9. Excel预测工作表
  10. 尚硅谷java数据结构与算法 韩顺平 数组实现队列问题