带头结点的单链表的初始化,建立,插入,查找,删除
//带头结点的单链表的初始化,建立,插入,查找,删除
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;//定义数据域类型
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
结构体中的 typedef struct Node 的意思就是,为自定义的数据类型定义一个新名字 Node。
//定义结点类型(由数据域,指针域组成)和链表LinkList/
typedef struct Node
{
ElemType data; //单链表的数据域
struct Node *next; //单链表的指针域
}Node,*LinkedList;
关于结构体 struct Node *next; 这么一句代码,为什么要这么写?我写成 int *next 行不行?
不行的。next是指向下一个Node,所以其类型必须是Node。int *next 只能指向int,而不能指向Node。所以必须定义为 Node 类型,但是 Node 是结构体,所以前面还得加上个 struct。
//单链表的初始化/
LinkedList LinkedListInit()
{
Node *L;
L=(Node *)malloc(sizeof(Node)); //申请结点空间
if(L==NULL) //判断是否有足够的内存空间
printf("申请内存空间失败");
L->next=NULL; //将next设置为NULL,初始长度为0的单链表.com
}
//单链表的建立1,头插法建立单链表/
LinkedList LinkedListCreateH()
{
Node *L;
L=(Node *)malloc(sizeof(Node)); //申请头结点空间
L->next=NULL; //初始化一个空链表
ElemType x; //x为链表数据域中的数据
while(scanf("%d",&x)!=EOF)
{
Node *p;
p=(Node *)malloc(sizeof(Node)); //申请新的结点
p->data=x; //结点数据域赋值
p->next=L->next; //将结点插入到表头
L->next=p;
}
return L;
}
//单链表的建立2,尾插法建立单链表/
LinkedList LinkedListCreateT()
{
Node *L;
L=(Node *)malloc(sizeof(Node)); //申请头结点空间
L->next=NULL; //初始化一个空链表
Node *r;
r=L; //r始终指向终端结点,开始时候指向头结点
ElemType x; //x为链表数据域中的数据
while(scanf("%d",&x)!=EOF)
{
Node *p;
p=(Node *)malloc(sizeof(Node)); //申请新的结点
p->data=x;
r->next=p ;
r=p;
}
return L;
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)
{
Node *pre; //pre为前驱结点
pre=L;
int temi=0;
for(temi=1;temi<i;temi++)
pre=pre->next ; //查找第i个位置的前驱结点
Node *p;
p=(Node *)malloc(sizeof(Node));
p->data=x;
p->next=pre->next;
pre->next=p;
}
return L;
}
//单链表的删除,在链表中删除值为x的元素
LinkedList LinkedListDelete(LinkedList L,ElemType x)
{
Node *p ,*pre; //pre为前驱结点,p为查找的结点;
p=L->next;
whiel(p-<data!=NULL)
{
pre=p;
p=p->next;
}
pre->next=p->next; //删除操作,将其前驱的next指向其后继
free(p);
return L;
}
int main()
{
LinkedList list,start;
printf("请输入单链表的数据:");
list = LinkedListCreatT();
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("/n");
int i;
ElemType x;
printf("请输入插入数据的位置:");
scanf("%d",&i);
printf("请输入插入数据的值:");
scanf("%d",&x);
LinkedListInsert(list,i,x);
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("/n");
printf("请输入要删除的元素的值:");
scanf("%d",&x);
LinkedListDelete(list,x);
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("/n");
return 0;
}
//题外话:
//带头结点初始化
Node *head; //声明头结点
void InitList(Node **head)
{
*head=(Node *)malloc( sizeof(Node));
(*head)->next=NULL;
}
//不带头结点初始化
方式一:
void InitList(Node **head){
*head=NULL;
}
调用InitList(&head);
方式二:
void InitList(Node *head){
head=NULL;
}
//带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。
相关知识拓展:
malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放。
转载于:https://www.cnblogs.com/God-boy1/p/3596532.html
带头结点的单链表的初始化,建立,插入,查找,删除相关推荐
- 不带头结点的单链表操作
不带头结点的单链表操作,包括插入.遍历.统计结点数等,要求写出数据结构算法思想及C语言实现函数 本文为博主原创文章,未经博主允许不得转载. 版权为陈博超所有,第一次于2021年06月22日发表于BLO ...
- 建立带头结点的单链表
[问题描述] 设有头结点单链表,实现单链表建立算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000): 第二行输入N个整数,以空格作为分隔,创建长度为N的单链表. [输出形式] 输出建立 ...
- 不带头结点的单链表的建立
建立该链表利用的是尾插法 // 创建一个单链表,没有头结点, #include <iostream> #include <ctime>using namespace std; ...
- 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最
[问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...
- 数据结构c/c++ 头插法尾插法建立带头结点的单链表,以数组创建带头结点的单链表和不带头结点的单链表,输出打印单链表
// // Created by 焦娇 on 2021/9/17. //#ifndef CHAPTER2_LINELINK_LLK_H #define CHAPTER2_LINELINK_LLK_H# ...
- 【C语言】数据结构C语言版 实验2 不带头结点的单链表
运行环境:Dev-C++ vs2013可能不能运行 首先新建一个头文件slnklist.h #include <stdio.h> #include <stdlib.h> /** ...
- 单链表创建之--头插法创建带头结点的单链表
单链表常见的创建方法有头插法和尾插法,这里记录头插法创建带头结点的单链表具体过程: 以C语言为例, 1)首先使用 typedef 关键字定义结点数据类型 typedef struct LNode{in ...
- 【考研】分清带头结点和不带头结点的单链表
CSDN话题挑战赛第2期 参赛话题:学习笔记 前言 为分清带结点与不带头结点的单链表操作,本文以图文和表格形式描述了两者之间的区别.考研中,数据结构的单链表操作是重要考点,其中,比较常考带头结点的链表 ...
- 2.3 带头结点的单链表:理论+编程实战(C语言详细)
1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...
最新文章
- 如何使用R来连接各个数据库
- 你知道JVM内存的那些事吗?
- lecture 4 : More Objective-C
- WCF 客户端连接慢
- js 控制文件名与文件大小
- springmvc的ModelAttribute注解
- 为什么用c语言程序中的if语句实现从1加到100最后的结果是负数,用C语言程式计算从1加到100的程式是怎样的?...
- 报数(约瑟夫环问题)
- 卸载windows激活码
- 【数据库】解剖式学习无损分解
- 如何打造一款火遍国内外的自走棋手游?我们跟《战歌竞技场》的美术和程序聊了聊
- 【安卓】安卓集成魔窗-完整实例
- read函数和write函数
- lr_think_time()
- c语言坦克大战程序设计,C语言坦克大战源码分析
- Polar SC的C语言实现之译码篇
- oracle表启用online,Oracle 表空间联机(online)与脱机(offline)
- UTF-8有BOM和无BOM的区别
- iOS程序启动原理---iOS-Apple苹果官方文档翻译
- 帆软报表动态数据源插件2.0使用教程
热门文章
- HTC S710D(电信版)G11解锁,成功ROOT
- 图书封面的故事之——“巴别塔”选自《七周七语言:理解多种编程范型》
- 分享最新40款免费的 WordPress 主题(上篇)
- UcSTAR统一通信平台
- Tell me why -- Declan Galbraith
- tpcc-mysql percona_tpcc-mysql 对percona5.6进行压力测试
- redis实例python_使用python操作redis(管道)
- hbase导入csv文件_HBase 数据导入 ImportTsv
- SpringMVC注解驱动开发
- html分页 css,js+css实现的简单易用兼容好的分页