链表-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 ...
随机推荐
- 死磕 java线程系列之ForkJoinPool深入解析
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ForkJoinPool分治线程池类. 简介 随着在硬件上多核处理器的发展和广泛使用,并发编程成为 ...
- [专题总结]AC自动机
其实前面的模板也不是1A,我在题库里提前做过,也不必在意罚时,刚开始我在做别的专题 裸模板我就不说了,各个博客讲解的很明白 void insert(string s){ ,len=s.size(); ...
- Redis实战--Redis整合SpringBoot示例
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文章 ...
- Git基础使用
前言 Git是版本控制系统,由Linux开源社区开发.与其他的版本系统相比,Git更加快速,便捷.主要是Git存储的是快照,而非差异性比较.并且绝大数操作都是访问本地文件和资源,没有网络时也可以直接提 ...
- css3mask淡出文字
css3mask淡出文字<pre>.p0_11wrap { width: 0.299rem; height: 7.68rem; overflow: hidden; background: ...
- 新手小白的Linux学习之路
大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...
- PHP 提交复选框数据
PHP 提交复选框数据 前台,name要加 []: <input type="checkbox" name="cate[]" value="ca ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- volatile变量能保证线程安全性吗?为什么?
在谈及线程安全时,常会说到一个变量——volatile.在<Java并发编程实战>一书中是这么定义volatile的——Java语言提供了一种稍弱的同步机制,即volatile变量,用来确 ...
- python:类1——类和对象基础
一.OO = Object Oriented 面向对象 OOP面向对象编程.OOA面向对象分析.OOD面向对象设计 二.属性+方法——>类(数据和函数) class Turtle(): #类名约 ...