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

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;
}
}
}

经检测,所有代码均可执行!

最新文章

  1. hdu4059 The Boss on Mars(差分+容斥原理)
  2. Web Service简要概念,学习记录!
  3. 【转载】Python的包管理工具Pip
  4. [Tool] Fiddle2基本使用
  5. Python基础09 面向对象的进一步拓展
  6. 简单的MySQL数据库主从同步配置
  7. [设计模式] 7 适配器模式 adapter
  8. Python 的格式化字符串format函数
  9. Compare the value of entity field.
  10. 浙大 pat 1047题解
  11. form表单验证提示语句
  12. 3星|《绩效使能:超越OKR》:较全较新资料汇编,华为实施经验少
  13. 一、Spring Boot 入门
  14. gentoo virtual couldnt download
  15. Android中长度单位和边距
  16. Unity3D工程版本管理方案【转自 兜里】
  17. static关键字的功能
  18. .NetCore下使用Prometheus实现系统监控和警报 (一)介绍【译】
  19. PHP获取访问者公网IP
  20. 洛谷P1301 魔鬼之城

热门文章

  1. 学习笔记47_关于Session局限性问题,Memcache
  2. iOS:探究视图控制器的转场动画
  3. 深度学习tensorflow实战笔记 用预训练好的VGG-16模型提取图像特征
  4. NOIP模拟 16
  5. MongoDB 谨防索引seek的效率问题
  6. 史上最全的excel读写技术分享
  7. ASCALL码对照表
  8. 『题解』洛谷P1351 联合权值
  9. Spring mvc之源码 handlerMapping和handlerAdapter分析
  10. 转载]OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]