data); p = p - > next; }} int main () { Node * a = (Node *) malloc ( sizeof (Node)); Node * b = (Node *) malloc ( sizeof (Node)); Node * c = (Node *) malloc ( sizeof (Node)); Node * d = (Node *) malloc ( sizeof (Node)); Node * e = (Node *) malloc ( sizeof (Node)); a- >data = 1 ; a- >next =" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何创建单链表

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-27 16:05 次阅读

实际中经常使用的一般为带头双向循环链表。

单链表1

#include< stdio.h >
#include< stdlib.h >

typedef struct node
{
 int data; //"数据域" 保存数据元素
 struct node * next; //保存下一个数据元素的地址
}Node;

void printList(Node *head){
    Node *p = head;
    while(p != NULL){
        printf("%dn",p- >data);
        p = p - > next;
    }
}

int main(){
  
  Node * a = (Node *)malloc(sizeof(Node));
  Node * b = (Node *)malloc(sizeof(Node));
  Node * c = (Node *)malloc(sizeof(Node));
  Node * d = (Node *)malloc(sizeof(Node));
  Node * e = (Node *)malloc(sizeof(Node));
  
  a- >data = 1;
  a- >next = b;
  
  b- >data = 2;
  b- >next = c;
  
  c- >data = 3;
  c- >next = d;
  
  d- >data = 4;
  d- >next = e;
  
  e- >data = 5;
  e- >next = NULL;
  
  printList(a);
}

结果:

图片

这个链表比较简单,实现也很原始,只有创建节点和遍历链表,大家一看就懂!

单链表2

这个链表功能多一点:

  1. 创建链表
  2. 创建节点
  3. 遍历链表
  4. 插入元素
  5. 删除元素
#include< stdio.h >
#include< stdlib.h >

typedef struct node
{
 int data; //"数据域" 保存数据元素
 struct node * next; //保存下一个数据元素的地址
}Node;

//创建链表,即创建表头指针 
Node* creatList()
{
 Node * HeadNode = (Node *)malloc(sizeof(Node));
 //初始化
 HeadNode- >next = NULL;
 return HeadNode;
}

//创建节点 
Node* creatNode(int data)
{
 Node* newNode = (Node *)malloc(sizeof(Node));
 //初始化
 newNode- >data = data;
 newNode- >next = NULL;
 return newNode;
}

//遍历链表
void printList(Node *headNode){
    Node *p = headNode - > next;
    while(p != NULL){
        printf("%dt",p- >data);
        p = p - > next;
    }
    printf("n");
}

//插入节点:头插法
void insertNodebyHead(Node *headNode,int data){
 //创建插入的节点 
    Node *newnode = creatNode(data);

    newnode - > next = headNode - > next;
    headNode - > next = newnode;
}

//删除节点
void deleteNodebyAppoin(Node *headNode,int posData){
 // posNode 想要删除的节点,从第一个节点开始遍历 
 // posNodeFront 想要删除节点的前一个节点 
    Node *posNode = headNode - > next;
    Node *posNodeFront = headNode;
    
 if(posNode == NULL)
  printf("链表为空,无法删除");
 else{
  while(posNode- >data != posData)
  {
   //两个都往后移,跟着 posNodeFront 走 
   posNodeFront = posNode;  
   posNode = posNodeFront- >next;
   if (posNode == NULL)
   {
    printf("没有找到,无法删除");
    return; 
   }
  }
  //找到后开始删除 
  posNodeFront- >next = posNode- >next;
  free(posNode);
 } 
}

int main(){
 
 Node* List = creatList();
 
 insertNodebyHead(List,1); 
 insertNodebyHead(List,2); 
 insertNodebyHead(List,3);  
 printList(List);
 
 deleteNodebyAppoin(List,2);
 printList(List);
 
 return 0;
}

结果:

图片

大家从最简单的单链表开始,学习链表的增删改查,然后再学习双链表,最后学习双向循环链表。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40124
  • 单链表
    +关注

    关注

    0

    文章

    13

    浏览量

    6918
收藏 人收藏

    评论

    相关推荐

    C语言链表的应用

    最近在看一些开源项目,大佬的思路还是很值得去学习,今天就简单介绍一下链表的应用,配合回调函数可以玩出新花样,废话不多说直接看代码!
    发表于 02-17 09:22 435次阅读

    数据结构:链表的排序

    给定一个链表的头结点head(该结点有值),长度为n的无序链表,对其按升序排序后,返回新链表。如当输入
    的头像 发表于 11-30 13:56 1586次阅读
    数据结构:<b class='flag-5'>单</b><b class='flag-5'>链表</b>的排序

    链表的缺陷是什么

    链表有一定的缺陷,就是单向性,只能从一个结点到下一个节点,而不能访问到上一个结点,而循环链表就可以解决这一问题,当然,用双向链表更加方便#include #include typed
    发表于 07-14 08:09

    OpenHarmony中的HDF链表及其迭代器

    概念为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构。链表链表
    发表于 08-30 10:31

    C语言实现链表举例

    所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为链表、双向链表和循环链表
    发表于 07-11 16:40 87次下载
    C语言实现<b class='flag-5'>单</b><b class='flag-5'>链表</b>举例

    链表学习的超详细说明(二)

    昨天跟大家分享了链表的一些基本用法,今天接着继续和大家分享链表的用法,今天分享完,链表的操
    的头像 发表于 12-24 17:33 765次阅读

    链表学习的总结(一)

    想必大多数人和我一样,刚开始学数据结构中的链表还是蛮吃力的,特别是后面的双链表操作更是如此。还有就是在实践代码操作时,你又会感到无从下手,没有思路。
    的头像 发表于 12-24 17:35 3433次阅读

    在STM32上创建链表并实现LCD滚动显示串口消息

    在STM32上创建链表并实现LCD滚动显示串口消息
    发表于 12-06 19:21 18次下载
    在STM32上<b class='flag-5'>创建</b><b class='flag-5'>链表</b>并实现LCD滚动显示串口消息

    双向循环链表创建

    需要注意的是,虽然双向循环链表成环状,但本质上还是双向链表,因此在双向循环链表中,依然能够找到头指针和头节点等。双向循环链表和双向链表相比,
    的头像 发表于 05-24 16:27 2101次阅读

    C语言_链表总结

    本篇文章介绍C语言链表相关知识点,涉及链表创建、单向链表、循环链表、双向链表、单向循环
    的头像 发表于 08-14 09:53 1779次阅读

    链表的基础知识

    的知识详细地叙述,所涉及的链表类型包括:链表,双链表,循环链表,每个链表的操作涉及到
    的头像 发表于 01-20 17:00 1065次阅读
    <b class='flag-5'>链表</b>的基础知识

    C++创建链表并输出

    使用C++代码创建一个链表并输出。
    的头像 发表于 01-10 15:05 1179次阅读

    C语言的链表应用

    最近在看一些开源项目,大佬的思路还是很值得去学习,今天就简单介绍一下链表的应用,配合回调函数可以玩出新花样,废话不多说直接看代码!
    的头像 发表于 02-20 15:03 579次阅读

    链表和双链表的区别在哪里

    链表和双链表的区别 链表的每一个节点中只有指向下一个结点的指针,不能进行回溯。 双链表的每一
    的头像 发表于 07-27 11:20 1653次阅读
    <b class='flag-5'>单</b><b class='flag-5'>链表</b>和双<b class='flag-5'>链表</b>的区别在哪里

    双向循环链表创建代码

    ; //保存下一个数据元素的地址 struct node * prev; //保存上一个数据元素的地址 }Node; //创建表头表示链表 Node* creatList() { Node * HeadNode
    的头像 发表于 07-27 11:26 934次阅读
    双向循环<b class='flag-5'>链表</b><b class='flag-5'>创建</b>代码