#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define ERROR 0;
#define OK 1;//typedef
typedef int Status;
typedef int ElemType;
typedef struct Node//定义带头结点的单链表的节点类型
{ElemType data;struct Node *next;
}Node;
typedef struct Node *LinkList;//操作函数声明
Status CreateListHead(LinkList*L,int n);
Status CreateListTail(LinkList *L,int n);
Status GetElem(LinkList L,int i,ElemType *e);
Status ListInsert(LinkList *L,int i,ElemType e);
Status ListDelete(LinkList*L,int i,ElemType *e);
Status DestroyList(LinkList *L);
Status ListTraverse(LinkList L);int main()
{LinkList L;int n=5;int e=0;int i=0;printf("请输入需要产生的单链表长度(>=1):");scanf("%d",&n);CreateListTail(&L,n);printf("产生的单链表是:");ListTraverse(L);printf("请输入你想要插入的位置和数:");scanf("%d %d",&i,&e);ListInsert(&L,i,e);printf("插入后得到的新链表是:");ListTraverse(L);printf("你想要查看哪个位置的数:");scanf("%d",&i);printf("该数是:");GetElem(L,i,&e);printf("\n");printf("你想要删除哪个位置的数:");scanf("%d",&i);ListDelete(&L,i,&e);printf("删除以后的新链表是:");ListTraverse(L);printf("现在要销毁链表释放空间啦!\n");DestroyList(&L);}//单链表的整表创建,头插法
Status CreateListHead(LinkList*L,int n)
{LinkList p;int i;srand(time(0));*L=(LinkList)malloc(sizeof(Node));( *L)->next=NULL;if(n<1)return ERROR;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(Node));p->data=rand()%100+1;p->next=(*L)->next;(*L)->next=p;}return OK;}
//单链表的整表创建,尾插法
Status CreateListTail(LinkList *L,int n)
{LinkList p,r;int i;*L=(LinkList)malloc(sizeof(Node));( *L)->next=NULL;r=*L;srand(time(0));for (i=0;i<n;i++){p=(LinkList)malloc(sizeof(Node));p->data=rand()%100+1;r->next=p;r=p;}r->next=NULL;return OK;
}//读取单链表中的第i个元素
Status GetElem(LinkList L,int i,ElemType *e)
{int j=1;LinkList p;p=L->next;while(p&&j<i){p=p->next;++j;}if(j>i||!p)return ERROR;*e=p->data;printf("%d",*e);return OK;
}//在单链表中第i个位置之前插入一个新节点e
Status ListInsert(LinkList *L,int i,ElemType e)
{int j=1;LinkList p,s;p=*L;while(p&&j<i){p=p->next;++j;}if (!p||j>i)return ERROR;s=(LinkList)malloc(sizeof(Node));s->data=e;s->next=p->next;p->next=s;return OK;
}//删除单链表的第i个元素,并用e返回其值
Status ListDelete(LinkList*L,int i,ElemType *e)
{int j=1;LinkList p,q;p=*L;while(p->next&&j<i){p=p->next;++j;}if (!(p->next)||j>i)return ERROR;q=p->next;p->next=q->next;* e=q->data;free(q);return OK;
}//销毁单链表
Status DestroyList(LinkList *L)
{LinkList p,q;p=(*L)->next;while(p){q=p->next;free(p);p=q;}free(*L);*L=NULL;printf("链表销毁成功!");return OK;
}
//打印单链表
Status ListTraverse(LinkList L)
{LinkList p;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");return OK;
}

程序测试结果:

关于二级指针使用的必要性,我是这样理解的:

很多操作其实使用一级指针也可以实现,但是在需要改变一级指针的值是就必须使用二级指针,例如,需要删除头结点或者生成链表时,L的值就需要变化,那么此时只有传入二级指针才能达到修改L的值的目的,这种情况下传入&L也是可行的。

下面举两个例子说明一下:

(1)

在链表已经生成的情况下,修改ListInsert函数为:

Status ListInsert(LinkList L,int i,ElemType e)
{int j=1;LinkList p,s;p=L;while(p&&j<i){p=p->next;++j;}if (!p||j>i)return ERROR;s=(LinkList)malloc(sizeof(Node));s->data=e;s->next=p->next;p->next=s;return OK;
}

程序仍然可以得到正确的结果。

(2)

但是在生成链表时,若只传入一级指针,即修改CreateListTail为:

Status CreateListTail(LinkList  L,int n)
{LinkList p,r;int i;L=(LinkList)malloc(sizeof(Node));L->next=NULL;r=L;srand(time(0));for (i=0;i<n;i++){p=(LinkList)malloc(sizeof(Node));p->data=rand()%100+1;r->next=p;r=p;}r->next=NULL;return OK;
}

则运行程序时,CodeBlocks会停止工作,这是因为在生成链表阶段,需要将L的值传出到主函数,供后面的链表打印函数ListTraverse调用。若此处只传入一级指针,则CreateListTail函数调用结束以后,L的值并没有改变,相当于L仍指向主函数中定义时所指向的位置(野指针或者指向NULL,暂时还不是很清楚如果不初始化指向哪里),则后续调用打印函数会出错。

总结:需要修改L的值时,必须传入二级指针即func(LinkList *L),其他情况下传一级指针即func(LinkList L)就ok。

单链表基本操作(可执行程序),二级指针使用必要性的初步理解相关推荐

  1. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

  2. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  3. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  4. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  5. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

  6. 【数据结构-C】单链表基本操作及图解分析

    目录 单链表介绍​ 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点​ 3. 尾插法向单链表中插入结点​ 4.头删法删除单链表结点​ 5.尾删法删除单链表结点​ 6.返回单链 ...

  7. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  8. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

  9. C语言实现单链表基本操作

    C语言实现单链表基本操作的 目录

最新文章

  1. Shell脚本头定义
  2. beta book读书俱乐部的构思
  3. 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )
  4. 编译器错误 CS1026
  5. linux的基础知识——TCP握手
  6. 软工总结暨团队成员自评(胡骏)
  7. JAVA:事件监听器之练习
  8. QQ2011的DD包密码验证报文解密密钥计算困惑之二
  9. MacOS 按键精灵推荐
  10. 华为ensp的缺省_网络 华为 ensp 命令
  11. HMS Core Insights第三期直播预告—— 当我们在谈论App的时候,我们还可以谈论什么?
  12. JAVA-DDD项目结构
  13. java 登陆短信验证码_JAVA短信验证登录
  14. pytorch是什么?解释pytorch的基本概念
  15. 到处走走-成都+峨眉山557
  16. 泡利不相容原理适用的空间范围(系统)是多大?
  17. 【有手就行】使用你自己的声音做语音合成
  18. 十分钟学会 web 开发利器 tornado
  19. android直播app下载地址,g直播app官方下载安装
  20. uni-app 微信小程序地图增加标记点,并实现点击弹窗

热门文章

  1. Python 元组 (tuple)
  2. 记一次Redis和NetMQ的测试
  3. HTTP学习记录:二、请求方法
  4. apache tomcat 整合
  5. SQL优化常用方法10
  6. Python网络协议模块学习之smtplib
  7. VMware SDS 之四:VSAN的技术细节
  8. MYSQL韩文显示正常一法
  9. SQL Tuning 基础概述01 - Autotrace的设定
  10. fedora18装一些软件及配置