链式存储线性表的结构体:

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语言实现的更多相关文章

  1. 链表c语言实现

    链表(c语言实现)--------------小练习   #include <stdio.h> #include <stdlib.h> #include <string. ...

  2. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  3. C链表-C语言入门经典例题

    struct student { long num; float score; struct student *next; }; 注意:只是定义了一个struct student类型,并未实际分配存储 ...

  4. 数据结构之链表C语言实现以及使用场景分析

    牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...

  5. 链表(C++语言实现)

    我使用的是严蔚敏的数据结构C语言版,很反感里面的全是伪代码,平常也没怎么敲代码,链表和顺序表是数据结构的第一个实验课程,顺序表还好,但是链表就有点困难了,因为里面涉及指针的运用.我对于指针并不是很精通 ...

  6. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

  7. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  8. (续)顺序表之单循环链表(C语言实现)

    单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点, 使得整个链表形成一个环. C实现代码如下: #include<stdio.h> typedef struc ...

  9. 静态链表C语言数据结构

    静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...

  10. 约瑟夫环问题 --链表 C语言

    总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...

随机推荐

  1. 读书笔记-《Maven实战》-2018/5/3

    5.7依赖调解 1.当一个项目有以下依赖关系的时候:A->B->C->X(1.0).A->D->X(2.0),X作为A的传递依赖而拥有两个版本,Maven为了解决以上问题 ...

  2. MIT线性代数:3.矩阵相乘

  3. Java类、对象、变量、方法

    对象:有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等 类:类是一个模板,描述一类对象的行为和状态 对象的行为通过方法来体现,状态就是对象的属性,变量可以是 ...

  4. 0818NOIP模拟测试25——B卷简记

    幸亏考场上没考这个,T1结论T2不会T3板子.估计会死的更惨 T1是学长讲过的Cat变式,沿直线y=x+1翻折方案数相减,现推,15分钟弄出来没什么问题. 只要不要把m,n读反就行. T3是个tarj ...

  5. [考试反思]0818NOIP模拟测试25:清心

    两机房分开考试.拿到了令人orz的A卷. 15本校+3外校=18人参加 排名第7,没前途.大不了去第二机房... skyh也很强了.tdcp拿来一个诡异的. 86,85,79.然后是我垃圾的.在后面差 ...

  6. 二、安装JDK - Java软件的安装

    jdk是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序. 1.安装包的下载:http://pan.baidu.com/s/1mgh58ve (该安装包是绿色的,解压 ...

  7. C#中的取整函数

    先放百度的 Math.Ceiling();向上取整 Math.Ceiling()向上取整: d = 4.56789 string res = Math.Ceiling(Convert.ToDecima ...

  8. 『题解』Codeforces121A Lucky Sum

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Petya loves lucky numbers. Everybody k ...

  9. 02-MyBatis执行Sql的流程分析

    目录 获取Mapper 简单总结 重要类 参考 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存.动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧. 还是以之前的 ...

  10. 私有git搭建

    Git简介(目前世界上最先进的分布式版本控制系统) 那什么是版本控制系统? 你可以把一个版本控制系统(缩写VCS)理解为一个特殊的“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要 ...