链表-C语言实现
链式存储线性表的结构体:
typedef int ElemType; //元素类型 typedef struct Node //链表结构体
{
ElemType date; //链表结点数据域
struct Node *next; //链表结点指针域
}Node,*LinkList;
创建链表:
/*
链表的创建操作
使用srand()时,需要引入头文件stdlib.h,即在头文件处添加 #include<stdlib.h>
使用time()时,需要引入头文件time.h,即在头文件处添加 #include<time.h>
使用malloc()时,需要引入头文件malloc.h,即在头文件处添加 #include<malloc.h>
*/
void CreatList(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time()); //初始化随机数种子
*L = (LinkList)malloc(sizeof(Node)); //创建链表空间 //不是表空间,是头结点 2018.8.13/于瑞
r = *L; //r为指向L尾部的指针
for(i = ; i < n; i++)
{
p = (Node *)malloc(sizeof(Node)); //创建新结点p //Node *与LinkList等价 2018.8.13/于瑞
p->date = rand() % +; //为新结点的数据域赋值
r->next = p; //使r指针指向p
r = p; //将p结点赋值给r,使r继续为表尾结点
}
r->next = NULL; //表尾结点指针域为空
}
链式存储的插入函数:
/*
链表的插入操作
*/
Status InsertList(LinkList *L, int i, ElemType e)
{
int j = ; //记录当前位置
LinkList p,s;
p = *L; //将p指向L的头结点
while(p && j < i) //判断p是否不为空 且 计数器j是否小于插入的位置i
{
p = p->next; //若是,将指针后移
j++; //计数器加1
}
if(!p || j > i) //判断p是否为空 或 计数器j是否大于插入位置i
return ERROR; //若是,说明链表为空 或 索引位置有误、 //运行到这,说明已找到需要插入的位置
s = (LinkList)malloc(sizeof(Node)); //创建新结点s
s->date = e; //将e值赋值给新结点s的数据域
s->next = p->next; //将p结点的指针域赋值给新结点s的指针域
p->next = s; //将新结点s赋值给p结点的指针域
return OK; //操作成功
}
链式存储的删除函数:
/*
链表的删除操作
*/
Status ListDel(LinkList *L, int i, ElemType *e)
{
int j = ; //计数器j
LinkList p = *L; //创建指针p指向L
LinkList q; //用于记录找到的结点信息,,必须有q,否则无法释放
while(p->next && j < i) //判断p是否不为空 且 计数器j是否小于插入的位置i
{
p = p->next; //若是,将指针后移
j++; //计数器加1
}
if(!(p->next) || j > i) //判断p是否为空 或 计数器j是否大于插入位置i
return ERROR; //若是,说明链表为空 或 索引位置有误 //运行到这,说明已找到需要插入的位置
q = p->next; //将要删除的结点p->next赋值给q
*e = q->date; //将p结点的数据域内容赋值给e
p->next = q->next; //将p->next的指针域赋值给p的指针域
free(q); //释放结点q
return OK; //操作成功
}
链式存储的索引查找函数:
/*
线性链表的查询操作
*/
Status GetElem(LinkList L, int i, ElemType *e)
{
int j = ; //
LinkList p = L->next; //声明指针p指向L的计数器第一个节点
while(p && j < i) //判断链表是否不为空 并且 计数器j是不是小于所需位置i的大小
{
p = p->next; //若是,是p指向下一节点
j++; //是计数器加1
}
if (!p || j>i) //判断p是否为空 或 计数器j是不是大于所需位置i的大小
return ERROR; //若是,说明链表为空或位置索引有误
*e = p->date; //若运行此句,说明已找到i位置的元素,将此结点的数据域内容赋值给e
return OK; //返回操作成功
}
链式存储的修改函数:
/*
链表的修改操作
*/
Status UpdateList(LinkList *L, int i, ElemType e)
{
LinkList p = (*L) ->next; //使p指向L的第一个结点
int j = ; //计数器j
while(p && j < i) //判断p非空 计数器小于所需位置
{
p = p->next; //指针后移
j++; //计数器加1
}
if(!p || j > i) //判断p为空 计数器大于所需位置
return ERROR; //返回失败
p->date = e; //使p的数据域为e
return OK; //操作成功
}
链式存储的遍历打印函数:
/*
链表的遍历操作
*/
void PrintList(LinkList L)
{
int j = ; //计数器
LinkList p = L->next; //使p指向L
if(!p)
printf("表空\n");
while(p)
{
printf("第%d个元素为%d\n",j,p->date);
p = p->next;
j++;
}
printf("\n");
}
整表删除函数:
/*
链表的整表删除操作
*/
Status ClearList(LinkList *L)
{
int j = ; //计数器1
LinkList p,q;
p = (*L)->next; //让p指向L
while(p)
{
q = p->next; //使q指向p
free(p); //释放p
p = q; //使p指向q
}
(*L)->next = NULL; //使头指针为空
return OK; //操作成功
}
主函数:
void main()
{
LinkList L; //创建链表L
int i, e; //i为元素位置,e为元素内容 while(true)
{
printf("请选择对线性链表的操作:\n");
printf("1.创建\n");
printf("2.插入\n");
printf("3.删除\n");
printf("4.查找\n");
printf("5.修改\n");
printf("6.输出\n");
printf("7.整表删除\n");
printf("8.退出\n");
int a;
scanf("%d", &a);
switch(a)
{
case :
printf("请输入需要创建元素的个数:");
scanf("%d", &i);
if(CreatList(&L, i))
printf("创建成功\n");
else
printf("创建失败\n");
break;
case :
printf("请输入需要插入的位置:");
scanf("%d", &i);
printf("请输入需要插入的元素:");
scanf("%d", &e);
if(InsertList(&L, i, e))
printf("插入成功\n");
else
printf("插入失败\n");
break;
case :
printf("请输入需要删除的位置:");
scanf("%d", &i);
if(ListDel(&L, i, &e))
printf("删除成功\n");
else
printf("删除失败\n");
break;
case :
printf("请输入需要查找的位置:");
scanf("%d", &i);
GetElem(L, i, &e);
printf("第%d个元素为%d\n",i,e);
break;
case :
printf("请输入需要修改的位置:");
scanf("%d", &i);
printf("请输入新的的元素:");
scanf("%d", &e);
if(UpdateList(&L, i, e))
printf("修改成功\n");
else
printf("修改失败\n");
break;
case :
PrintList(L);
break;
case :
if(ClearList(&L))
printf("清空成功\n");
else
printf("清空失败\n");
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}
经检测,所有代码均可执行!
链表-C语言实现的更多相关文章
- 链表c语言实现
链表(c语言实现)--------------小练习 #include <stdio.h> #include <stdlib.h> #include <string. ...
- 单链表 C语言 学习记录
概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...
- C链表-C语言入门经典例题
struct student { long num; float score; struct student *next; }; 注意:只是定义了一个struct student类型,并未实际分配存储 ...
- 数据结构之链表C语言实现以及使用场景分析
牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...
- 链表(C++语言实现)
我使用的是严蔚敏的数据结构C语言版,很反感里面的全是伪代码,平常也没怎么敲代码,链表和顺序表是数据结构的第一个实验课程,顺序表还好,但是链表就有点困难了,因为里面涉及指针的运用.我对于指针并不是很精通 ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
- 静态链表 C语言描述
静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...
- (续)顺序表之单循环链表(C语言实现)
单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...
- 静态链表C语言数据结构
静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...
- 约瑟夫环问题 --链表 C语言
总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...
随机推荐
- mysql中的锁机制之悲观锁和乐观锁
1.悲观锁? 悲观锁顾名思义就是很悲观,悲观锁认为数据随时就有可能会被外界进行修改,所以悲观锁一上来就会把数据给加上锁.悲观锁一般都是依靠关系型数据库提供的锁机制,然而事实上关系型数据库中的行锁,表锁 ...
- C++学习笔记8_零碎的知识
1. int main(void) { int arr[] = {1,2,3,4}; //数组的长度 int len = sizeof(arr)/sizeof(int); //由此可以看出,sizeo ...
- [考试反思]0903NOIP模拟测试36:复始
因为多次被说颓博客时间太长于是 真香 恢复粘排行榜的传统. 大体上就是,T1A的前三,剩下的T2A的排名,再然后按照T3暴力得分排名. T1是个暴力.3个A的5个得分的.数据点极强爆零率极高. 我的思 ...
- Apache配置反向代理、负载均衡和集群(mod_proxy方式)
Apache配置负载均衡和集群使用mod_jk的方式比较多,但是mod_jk已经停止更新,并且配置相对复杂.Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多. 1 ...
- day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树
来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...
- C表达式中的汇编指令
C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...
- 你知道MySQL中的主从延迟吗?
前言 在一个MySQL主备关系中,每个备库接受主库的binlog并执行. 正常情况下,只要主库执行更新生成所有的binlog,都可以传到备库并被正常的执行,这样备库就能够达到跟主库一样的状态,这就是最 ...
- C++总结(1)keywords to the class
目录 Chapter 1.关于类的关键字 1. class,struct与union 2.private,public与protected 3.friend 4.virtual 5.const 6.i ...
- linux引导之grub2
先了解下什么是Bootloader 以下是百度百科释意 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适 ...
- nyoj 263-精 挑 细 选 (sort(P, P+m, cmp); bool cmp(node a, node b)...)
263-精 挑 细 选 内存限制:64MB 时间限制:3000ms 特判: No 通过数:14 提交数:26 难度:1 题目描述: 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根 ...