文章目录

  • 单链表定义
  • 不带头结点单链表
  • 带头结点单链表
  • 头结点和头指针的区分
  • 带头结点单链表优点

单链表定义

线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。

不带头结点单链表

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int datatype;
typedef struct link_node
{datatype data;struct link_node *next;
} node,*linklist;   //node*等价于linklist
bool emptylist(linklist L)
{if(L==NULL)return true;elsereturn false;
}
linklist init()   //初始化单链表
{return NULL;
}
linklist creat1()   //首插法
{node *head,*s;datatype x;head=NULL;printf("首插法创建单链表,为9999时结束,请输入数据:\n");scanf("%d",&x);while(x!=9999){s=(node*)malloc(sizeof(node));s->data=x;s->next=head;head=s;scanf("%d",&x);}return head;
}
linklist creat2()   //尾插法
{node *head,*s,*r;datatype x;head=NULL;r=NULL;printf("尾插法创建单链表,为9999时结束,请输入数据:\n");scanf("%d",&x);while(x!=9999){s=(node*)malloc(sizeof(node));s->data=x;if(head==NULL)head=s;elser->next=s;r=s;scanf("%d",&x);}if(r)r->next=NULL;return head;
}
linklist insertlist(node *head,datatype x,int position)   //在第i个节点插入x
{node *q,*p;p=head;int i=1;while(p&&i<position-1){p=p->next;i++;}if((p==NULL&&position!=1)||position<1){printf("插入位置错误!\n");}else{q=(node*)malloc(sizeof(node*));q->data=x;if(position==1){q->next=head;head=q;}else{q->next=p->next;p->next=q;}}return head;
}
linklist deletelist(node* head,int position)   //删除第i个节点
{node *p,*q;p=head;if(emptylist(head)){printf("单链表为空,无法删除!\n");}else{int i=1;while(p&&i<position-1){p=p->next;i++;}if((p->next==NULL&&position!=1)||position<1){printf("删除位置错误!\n");}else{if(position==1){head=p->next;free(p);}else{q=p->next;p->next=q->next;free(q);}}}return head;
}
linklist getelem(node *head,int position)   //查找第i个节点
{node *p;int i=1;p=head;if(position<1)return NULL;while(p&&i<position){p=p->next;i++;}return p;
}
void displaylist(node *head)
{node *p;p=head;if(emptylist(head))printf("单链表为空!\n");else{printf("单链表各节点元素为:");while(p){printf("%5d",p->data);p=p->next;}printf("\n");}
}
int main()
{linklist L;datatype x;int position;node *p;L=init();displaylist(L);L=creat1();displaylist(L);printf("请输入要插入节点的数据和位置:\n");scanf("%d%d",&x,&position);L=insertlist(L,x,position);displaylist(L);printf("请输入要删除节点的位置:\n");scanf("%d",&position);L=deletelist(L,position);displaylist(L);printf("请输入要查找节点的位置:\n");scanf("%d",&position);p=getelem(L,position);if(p==NULL)printf("第%d个节点不存在!\n",position);elseprintf("第%d个节点元素为:%d\n",position,p->data);displaylist(L);
}

带头结点单链表

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int datatype;
typedef struct link_node
{datatype data;struct link_node *next;
} node,*linklist;   //node*等价于linklist
bool emptylist(linklist L)   //判断单链表是否为空
{if(L->next==NULL)return true;elsereturn false;
}
linklist init()   //初始化单链表
{node *head;head=(node*)malloc(sizeof(node));head->next=NULL;return head;
}
linklist creat1()   //首插法
{node *head,*s;datatype x;head=(node*)malloc(sizeof(node));head->next=NULL;printf("首插法创建单链表,为9999时结束,请输入数据:\n");scanf("%d",&x);while(x!=9999){s=(node*)malloc(sizeof(node));s->data=x;s->next=head->next;head->next=s;scanf("%d",&x);}return head;
}
linklist creat2()   //尾插法
{node *head,*s,*r;datatype x;r=(node*)malloc(sizeof(node));r->next=NULL;head=r;printf("尾插法创建单链表,为9999时结束,请输入数据:\n");scanf("%d",&x);while(x!=9999){s=(node*)malloc(sizeof(node));s->data=x;r->next=s;r=s;scanf("%d",&x);}if(r)r->next=NULL;return head;
}
linklist insertlist(node *head,datatype x,int position)   //在第i个节点插入x
{node *q,*p;p=head;int i=0;while(p&&i<position-1){p=p->next;i++;}if((p==NULL&&position!=1)||position<1){printf("插入位置错误!\n");}else{q=(node*)malloc(sizeof(node*));q->data=x;q->next=p->next;p->next=q;}return head;
}
linklist deletelist(node* head,int position)   //删除第i个节点
{node *p,*q;p=head;if(emptylist(head)){printf("单链表为空,无法删除!\n");}else{int i=0;while(p&&i<position-1){p=p->next;i++;}if((p->next==NULL&&position!=1)||position<1){printf("删除位置错误!\n");}else{q=p->next;p->next=q->next;free(q);}}return head;
}
linklist getelem(node *head,int position)   //查找第i个节点
{node *p;int i=1;p=head->next;if(position<1)return NULL;while(p&&i<position){p=p->next;i++;}return p;
}
void displaylist(node *head)
{node *p;p=head->next;if(emptylist(head))printf("单链表为空!\n");else{printf("单链表各节点元素为:");while(p){printf("%5d",p->data);p=p->next;}printf("\n");}
}
int main()
{linklist L;datatype x;int position;node *p;L=init();displaylist(L);L=creat1();displaylist(L);printf("请输入要插入节点的数据和位置:\n");scanf("%d%d",&x,&position);L=insertlist(L,x,position);displaylist(L);printf("请输入要删除节点的位置:\n");scanf("%d",&position);L=deletelist(L,position);displaylist(L);printf("请输入要查找节点的位置:\n");scanf("%d",&position);p=getelem(L,position);if(p==NULL)printf("第%d个节点不存在!\n",position);elseprintf("第%d个节点元素为:%d\n",position,p->data);displaylist(L);
}

头结点和头指针的区分

不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的单链表中的第一个结点,结点内通常不存储信息。

带头结点单链表优点

  • 由于第一个数据节点的位置被存放在头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作一致,无须进行特殊处理。
  • 无论链表是否为空,其头指针都是指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理得到了统一。

数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)相关推荐

  1. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  2. C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

    http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...

  3. 单链表操作实现getelem_c语言实现--带头结点单链表操作

    可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...

  4. 小白算法积累——单链表6#带头结点单链表+递增有序

    题目:有一个带头结点的单链表L,设计一个算法使其元素递增有序. 关键字:带头结点单链表+递增有序 思路 采用直接插入排序算法的思想:就是先分理出头结点+第一个结点组成原始新链表,然后依次将后续结点摘下 ...

  5. 在单链表(带头结点)中的第i个位置前面插入一个新结点的初始化问题

    方法: 想要在链表第i个元素前面插入新结点,则需要将指针指向第i-1个元素,从而将其next域中保存的第i个元素地址赋值给新结点,实现链接. void InserttoList(LinkList he ...

  6. 单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

    编程语言:c语言 编译环境:Dev-c++ 实现功能:实现功能:单链表(带头结点)结点结构体的定义,单链表(带头结点)初始化.求元素个数.插入元素.删除元素.取元素.打印所有元素.就地逆置.撤销的操作 ...

  7. 头插法建立单链表(带头结点和不带头结点)

    头插法建立单链表(带头结点) #include <stdio.h> #include <stdlib.h> typedef struct LNode{        //定义单 ...

  8. 单链表:带头结点和不带头结点 总结

    写在前面: 一直以来,带头结点和不带头节点的单链表的操作实现困扰着我.在没有理解和实现之前,光凭思考真的是很难理解清楚 1.两者之间代码的差异: 2.带不带头结点的区别: 3.带头结点之后,什么情况下 ...

  9. 带头结点的单链表的操作(C语言)

    初始化 先了解头结点 头结点是一个特殊的结点,它的数据域不存储信息,通常情况下,头指针指向的结点为头结点,由于头结点不存储信息,所以不是数据结构中的实际结点,第一个实际结点其实是head->ne ...

最新文章

  1. QWidget一生,从创建到销毁事件流
  2. 滴,这周的福利已掉落,镁客君请你免费骑摩拜
  3. STL中用erase()方法遍历删除元素
  4. 完全详解--Silverlight 下载文件
  5. JavaScript try/catch/finally 语句
  6. mysql数据库性能指标结果_MySQL数据库性能优化的关键参数(转)
  7. Kettle使用_6 配置资源库
  8. 「每天一道面试题」String和StringBuilder、StringBuffer的区别
  9. 工作总结21:阅读代码之axios
  10. for in / for of 要会用
  11. 吊炸天!一行命令快速部署大规模K8S集群!!!
  12. jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式
  13. ccsa安学网小程序_【大检修】“CCSA安学网”掀起指尖上的学习热潮,助力1#大检修...
  14. JavaScript console.log导致错误:“不赞成在主线程上使用同步XMLHttpRequest…”
  15. Jmockit单元测试MockUp调用原始方法
  16. iPhone使用教程
  17. Linux学习笔记(五) -- Linux+Anjuta搭建C++开发环境
  18. vue 高德获取当前经纬度
  19. 密码:大写字母 小写字母 数字 特殊字符(四种里至少三种)
  20. 论文阅读:Which Has Better Visual Quality: The Clear BlueSky or a Blurry Animal?

热门文章

  1. su鉴定故障和su拒绝权限
  2. 普通用户使用su无法切到root用户的解决方法
  3. MATLAB 中contour的应用
  4. 燃气热水器和电热水器哪个好 燃气热水器和电热水器的优缺点
  5. qt登录界面简单制作,是真的保姆级别了!!!
  6. 客户关系维护注意事项 如何维护客户关系
  7. 服务器500系列错误解释
  8. 深度学习中Concat层和Flatten层作用
  9. 电磁场与仿真软件(24)
  10. 名编辑电子杂志大师教程 | 添加页码