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

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. Map Reduce 论文阅读

    Map Reduce 是 Google 在 2004 年发表的一篇论文,原文链接 在这 后来 Hadoop 直接内置了这一框架. 读完之后记录一下心得. 主要背景:MapReduce 的出现很具有工程 ...

  2. js 重写a标签的href属性和onclick事件

    适应场景:假如移动端拨打电话,需要给a标签添加href属性,但是由于需求,需要链接跳转的同时给a标签添加onclick事件,如果不做任何处理的话,默认执行点击事件,而不会跳转href属性的链接. 怎么 ...

  3. 曹工杂谈:为什么很少需要改Spring源码,因为扩展点太多了,说说Spring的后置处理器

    前言 最近发了好几篇,都是覆盖框架源码,但是spring的代码,我是从没覆盖过,毕竟,如果方便扩展,没谁想去改源码,而spring就是不需要改源码的那个,真的是"对扩展开放,对修改关闭&qu ...

  4. 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式

    1.linux系统中的中断处理  1.0裸板中中断异常是如何处理的?     以s5p6818+按键为例          1)按键中断的触发        中断源级配置            管脚功 ...

  5. springboot~高并发下耗时操作的实现

    高并发下的耗时操作 高并发下,就是请求在一个时间点比较多时,很多写的请求打过来时,你的服务器承受很大的压力,当你的一个请求处理时间长时,这些请求将会把你的服务器线程耗尽,即你的主线程池里的线程将不会再 ...

  6. 【原创】使用批处理脚本自动生成并上传NuGet包

    Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...

  7. Python基础之JSON

    作用 对Python对象进行序列化,便于存储和传输 Python对象与JSON字符串相互转换 Python对象转JSON字符串 import json data = [ { 'a' : 1, 'b' ...

  8. tornado的使用-数据库篇

    tornado的使用-数据库篇

  9. nyoj 99-单词拼接 (euler, dfs)

    99-单词拼接 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:14 难度:5 题目描述: 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下 ...

  10. java中hashmap容量的初始化

    HashMap使用HashMap(int initialCapacity)对集合进行初始化. 在默认的情况下,HashMap的容量是16.但是如果用户通过构造函数指定了一个数字作为容量,那么Hash会 ...