单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...
很早之前学的数据结构,放了很久后,以致对里面的一些操作都有些遗忘,故而再次温习了一下数据结构,并整理了一点儿笔记,放在这里和大家分享, 我的代码注释的已经很详细了,对于容易出错的地方我也都有标注,欢迎大家交流。
#include "stdafx.h" #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <time.h> #define OK 1 #define ERROR 0//#define typedef int Status;//函数返回的状态值类型 typedef int ElemType; typedef struct Node {ElemType data;struct Node *next; } Node;//定义一个单链表存储结构 typedef struct Node *LinkList;//定义一个线性表,定义的是Node结构体的指针//创建一个具有n个元素的单链线性表,采用头插法创建,注意:其中已经包含了初始化操作 //初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L //*L表示结构体指针的指针 Status List_Link_Create(LinkList *L,int n)//头插法 {LinkList p;*L =(LinkList) malloc(sizeof(Node));//产生一个头结点,并使得*L指向这个头结点,于是*L便是一个头指针,头指针是链表的必要元素if (L == NULL)return ERROR;(*L)->next = NULL;//使得头指针指向的内容为空,建立一个带头结点的单链表printf("请输出n个随机生成的数字:");for (int i = 0; i < n; i++){p = (LinkList)malloc(sizeof(Node));//生成新节点p->data = rand() % 100 + 1;//随机生成100以内的数字printf("%d", p->data);printf(" ");//字符与字符之间空格 p->next = (*L)->next;(*L)->next = p;//插入到表头 }printf("\n");//换行return OK; }Status List_Link_Length(LinkList L)//求出单链表的长度 {int j = 0;LinkList p;p = L;while (p != NULL){p = p->next;j++;}printf("单链表当前的长度=%d",j);return j; } //Status List_Link_Ini(LinkList L)//初始化一个线性单链表 //{ // L = (LinkList)malloc(sizeof(Node));//产生一个头结点,并使得L指向这个头结点,于是L便是一个头指针,头指针是链表的必要元素 // if (L == NULL) // return ERROR; // L->next = NULL;//使得头结点的指针域为空 // return OK; //}//销毁链表L,释放链表L申请的内存,使L的值重新变为NULL,所以会改变L的值,得用*L Status List_Link_Destory(LinkList *L) {LinkList p,q;p = (*L)->next;while (p){q = p->next;free(p);p = q;}(*L)->next = NULL;//头节点的指针域为空return OK; }Status List_Link_Insert(LinkList *L, int i, ElemType e)//在L中第i个元素之前插入新的数据元素e {int j;LinkList p, s;p = *L;j = 1;while (p&&j<i)//遍历寻找第i个节点 {p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在s = (LinkList)malloc(sizeof(Node));//生成一个新节点s->data = e;s->next = p->next;//将p的后继节点赋值给s的后继p->next = s;printf("插入节点的元素的值为:%d\n", e);return OK;//插入成功 }//删除L的第i个数据元素,并用e返回其值 //注意这里是*e,而不是e,区别于插入当中的变量e Status List_Link_Delete(LinkList *L, int i, ElemType *e) {int j=1;LinkList p, q;p = *L;while (p->next&&j<i)//遍历寻找第i个元素 {p = p->next;++j;}if (!(p->next) || j > i)return ERROR;//第i个元素不存在 q = p->next;//q表示即将被删除元素的节点*e = q->data;p->next = q->next;//将q 后继赋值给p的后继free(q);//q被利用完毕后,将q释放printf("删除第%d个节点的元素值为:%d\n", i, *e);return OK;}Status List_Link_GetElem(LinkList L, int i, ElemType *e)//取出单链表L中的第i个元素,并通过*e返回 {int j;LinkList p;p = L->next;//找到单链表L中第一个节点j = 1;while (p&&j < i){p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在*e = p->data;//取出第i个元素的数据域并传值给*eprintf("被取出的元素的值为:");printf("%d\n", *e);return OK; } int main()//测试函数 {LinkList L1;ElemType f,h;List_Link_Create(&L1, 6);List_Link_GetElem(L1, 3, &f);List_Link_Insert(&L1, 3, 15);//在链表的第3个节点之前插入元素15List_Link_Delete(&L1, 3, &h);//删除链表的第3个节点的元素,并返回给h输出return OK; }/*1.对于LinkList L : L是指向定义的node结构体的指针, 可以用->运算符来访问结构体成员, 即L->elem, 而(*L)就是个Node型的结构体了, 可以用点运算符访问该结构体成员, 即(*L).elem;2.对于LinkList *L:L是指向定义的Node结构体指针的指针, 所以(*L)是指向Node结构体的指针, 可以用->运算符来访问结构体成员, 即(*L)->elem, 当然, (**L)就是Node型结构体了, 所以可以用点运算符来访问结构体成员, 即(**L).elem;3.在链表操作中, 我们常常要用链表变量作物函数的参数, 这时, 用LinkList L还是LinkList *L就很值得考虑深究了, 一个用不好, 函数就会出现逻辑错误, 其准则是:如果函数会改变指针L的值, 而你希望函数结束调用后保存L的值, 那你就要用LinkList *L, 这样, 向函数传递的就是指针的地址, 结束调用后, 自然就可以去改变指针的值;而如果函数只会修改指针所指向的内容, 而不会更改指针的值, 那么用LinkList L就行了;*/
下面是我在vs2013中的测试结果:
请输出n个随机生成的数字:42 68 35 1 70 25
被取出的元素的值为:1
插入节点的元素的值为:15
删除第3个节点的元素值为:15
请按任意键继续. . .
转载于:https://www.cnblogs.com/huster666/p/5642638.html
单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...相关推荐
- 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...
的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...
- C语言单链表实现初始化、创建、增、删、查等基本操作(详细)
C语言单链表实现初始化.创建.增.删.查等基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h&g ...
- C语言-数据结构-单链表的初始化,插入和输出
[问题描述] 设有头结点单链表,实现单链表的初始化.插入和输出算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000),一个M(N大于等于1,小于1000): 第二行输入N个整数,以空格作 ...
- 带头结点的单链表的初始化,建立,插入,查找,删除
//带头结点的单链表的初始化,建立,插入,查找,删除 #include <stdio.h> #include <stdlib.h> typedef int El ...
- java实现hbase表创建、数据插入、删除表
近日查看了相关资料后,梳理了一下用java实现hbase的表创建.数据插入.删除表,代码如下: 1.需要的jar包: commons-codec-1.4.jar commons-logging-1.0 ...
- mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...
展开全部 sql语句从一张表中查询数据插入到另一张表中的方法如下:e68a843231313335323631343130323136353331333365653762 1.select * int ...
- mysql将查询结果写入另一张表_将一张表的查询结果插入到另一张表(转)
将一张表的查询结果插入到另一张表 方法一: 代码 1 select into 和 insert into select 两种表复制语句 2 select * into destTbl from src ...
- 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现
写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...
- c语言判断顺序链表是否为空,数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)...
1.单链表(带头结点)的初始化 即,构造一个空表,如下图, 算法步骤: 1.生成新结点作头结点,用头指针L指向头结点. 2.将头指针的指针域置空. 算法描述: Status InitList_L(Li ...
最新文章
- STM32-USART控制led和蜂鸣器
- Subsonic设置--新手上路
- Spring学习(8)--- @Autowired注解(一)
- 给linux下网站目录配置SFTP
- css3实现超出文本指定行数(指定文本长度)用省略号代替
- python语言程序设计实验答案实验八函数_C++程序设计 实验8 实验报告 标准答案...
- 深挖前端 JavaScript 知识点 —— 史上最全面、最详细的 Cookie 总结
- 医药/医疗/互联网医疗服务平台/问诊/挂号/开药/处方/医生/医院/问诊订单管理/移动端问诊医疗系统/医生端处方开药系统/web端医药服务平台管理/axure原型/rp源文件/健康咨询/视频问诊/统计
- CREATE VIEW SQL:在SQL Server中使用索引视图
- java 表单字段扩展_如何从Chrome扩展程序填写网页表单中的文本字段?
- D1-H哪吒 设置hdmi分辨率
- ESAPI自定义配置文件路径
- Vue 遍历单项选择 答题卡
- Java多线程的简介
- eda交通灯控制器波形输入_EDA 基于quartus平台制作的步行街自助式交通灯控制器(含vhdl程序、波形图、及电路原理图)+课程设计报告...
- Pandas学习——文本数据
- QA | R做生存分析如何取最佳cutoff(截断)
- eCognition软件中ESP2插件的下载与安装
- 中国首次包揽2021年国际信息学奥赛(IOI 2021)前四名
- 这几年被分布式坑惨了,曝光十大坑
热门文章
- 查询字符串某个字符的个数
- C++之对象的动态建立和释放
- 【VBA编程】10.自定义集合
- 背景图片适应屏幕百分百
- iTunes“解决方案”发展历程及研究(上)
- Linux直接与编译安装Vsftpd服务器
- HttpClient和DefaultHttpClient
- python核心,内建函数,高阶函数
- 解决bash: mysql: command not found 的方法【linux mysql命令 】
- qtableview点击行将整行数据传过去_可以实时获取数据的Database Asset插件