单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...

      很早之前学的数据结构,放了很久后,以致对里面的一些操作都有些遗忘,故而再次温习了一下数据结构,并整理了一点儿笔记,放在这里和大家分享, 我的代码注释的已经很详细了,对于容易出错的地方我也都有标注,欢迎大家交流。

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdfs复制文件夹_HDFS常用命令

一.HDFS命令行Hadoop help命令的使用1.hadoop -help查询所有Hadoop Shell支持的命令2.distcp这是Hadoop下的一个分布式复制程序&#xff0c;可以在不t同的HDFS集群间复制数据&#xff0c;也可以在本地文件间复制数据。hadoop distcp将/test/test.txt文件复制到/test/cp下面&…

人工智能python零基础入门教程_人工智能零基础入门视频教程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼人工智能零基础入门视频教程100天人工智能工程师学习计划 —— 全程实战案例&#xff0c;从机器学习原理到推荐系统实现&#xff0c;从深度学习入门到图像语义分割及写诗机器人&#xff0c;再到专属GPU云平台上的四大工业级实战项目…

处理相对时间(Day.js、Moment.js)(案例:结合vue的过滤器使用)

推荐两个第三方库&#xff1a; Moment.jsDay.js 两者都是专门用于处理时间的 JavaScript 库&#xff0c;功能差不多&#xff0c;因为 Day.js 的设计就是参考的 Moment.js。但是 Day.js 相比 Moment.js 的包体积要更小一些&#xff0c;因为它采用了插件化的处理方式。 Day.js…

Linux之Json20160705

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式&#xff0c;这些特性使JSON成为理想的数据交换语言。易于人阅读和编写&#xff0c;同时也易于机器解析和生成。 基础结构 JSON建构于两种结构&#xff1a;1. “名称/值”对的集…

下载 嵌入式qt实战教程pdf_Qt之JSON教程-实战篇

以实战例子讲述JSON三兄弟的后续故事。实战一&#xff1a;发送JSON网络请求作为JSON老大哥的QJsonValue自知对面的大户人家妹子貌美如花&#xff0c;心里已经打起算盘&#xff0c;先下手为强&#xff0c;后下手遭殃。决定显示下自己的家底&#xff0c;想起这件事&#xff0c;老…

注册tomcat为服务

http://guomingjun.iteye.com/blog/1564894转载于:https://www.cnblogs.com/diyunpeng/p/5646055.html

Vue移动端项目——搜索联想建议功能的实现(结合watch属性和使用lodash防抖节流)

搜索联想建议 1. 基本思路&#xff1a; 当搜索框输入内容的时候&#xff0c;请求加载联想建议的数据 将请求得到的结果绑定到模板中 2. 基本功能 一、将父组件中搜索框输入的内容传给联想建议子组件 二、在子组件中监视搜索框输入内容的变化&#xff0c;如果变化则请求获取…

.net get set 初始化_.NET项目升级:可为空引用

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;波多尔斯基cnblogs.com/podolski/p/12692888.html前言C#8引入了新特性&#xff1a;可为空引用https://docs.microsoft.com/zh-cn/dotnet/csharp/nullable-references这个功能个人觉得挺好的&#xff0c;能够非常明确的…

用GDB排查Python程序故障

某Team在用Python开发一些代码&#xff0c;涉及子进程以及设法消除僵尸进程的需求。实践中他们碰上Python程序非预期退出的现象。最初他们决定用GDB调试Python解释器&#xff0c;查看exit()的源头。我听了之后&#xff0c;觉得这个问题应该用别的调试思路。帮他们排查这次程序故…

解决后端返回数据中的大数字问题(使用第三方包json-bigint )

JavaScript 能够准确表示的整数范围在-2^53到2^53之间&#xff08;不含两个端点&#xff09;&#xff0c;超过这个范围&#xff0c;无法精确表示这个值&#xff0c;这使得 JavaScript 不适合进行科学和金融方面的精确计算。 Math.pow(2, 53) // 90071992547409929007199254740…

java 静态代码块_关于Java你不知道的那些事之代码块

前言普通代码块&#xff1a;在方法或语句中出现的{}&#xff0c;就被称为代码块静态代码块&#xff1a;静态代码块有且仅加载一次&#xff0c;也就是在这个类被加载至内存的时候普通代码块和一般语句执行顺序由他们在代码中出现的次序决定&#xff0c;先出现先执行代码一/**对于…

Vue项目开发过程中解决跨域问题(vue.config.js结合axios)

一、问题描述 在本地开发过程中&#xff0c;调用后端提供的接口获取数据将获取的数据渲染到页面中&#xff0c;但是浏览器报错&#xff1a; // 控制台报错信息 Access to XMLHttpRequest at http://x.x.x.x/app/v1_0/user/followings from origin http://localhost:8080 has…

css之规范命名

Css的规范命名 头&#xff1a;header   内容&#xff1a;content/container   尾&#xff1a;footer   导航&#xff1a;nav   侧栏&#xff1a;sidebar 栏目&#xff1a;column   页面外围控制整体布局宽度&#xff1a;wrapper   左右中&#xff1a;left r…

python 查询sqlserver 视图_SQL Server查看视图定义总结

在SQL Server中如何查看数据库视图的定义呢&#xff1f; 其实官方文档已经有一个较详细的总结了&#xff0c;这里在官方文档的基础上&#xff0c;我们再深入展开分析一下&#xff0c;例如如何获取系统视图的定义。知其然知其所以然吗。1&#xff1a;使用SQL Server Management …

WebSocket实现实时通信

WebSocket 是一种数据通信协议&#xff0c;也是用于客户端和服务端数据通信&#xff0c;类似于我们常见的 http 既然有 http&#xff0c;为啥还要 WebSocket http 通信是单向的 请求 响应 没有请求也就没有响应 初次接触 WebSocket 的人&#xff0c;都会问同样的问题&#xf…

response.setContentType()的作用及MIME参数详解

转自脚本之家 原文http://www.jb51.net/article/32773.htmresponse.setContentType(MIME)的作用是使客户端浏览器&#xff0c;区分不同种类的数据&#xff0c;并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据,本文详细介绍&#xff0c;需要了解的朋友可以参考…

使用socket.io搭建一个实时聊天机器人

一、安装socket.io npm i socket.io --save二、使用 第一种&#xff1a;服务端使用原生node // 创建http服务器 const http require(http) var fs require(fs) const app http.createServer()app.on(request, (req, res) > {fs.readFile(__dirname /index.html, funct…

真随机和伪随机区别_用骰子DIY真随机助记词 | 火星号精选

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦

EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计

EasyDarwin现有架构介绍 EasyDarwin的现有架构对网络事件的处理是这样的&#xff0c;每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session&#xff0c;不论是RTSP服务对应的RTSPSession&#xff0c;还是HTTP服务对应的HTTPSession&#xff0c;都是一个继承自Task类…

python对文件的写操作方法writetext_用python实现读写文件常见操作方式

1 文件读取全文本操作在一定场景下我们需要把文本全部内容读取出来&#xff0c;进行处理。python提供三种函数读取文件&#xff0c;分别是read readline readlines&#xff0c;read()&#xff1a;读取文件的全部内容&#xff0c;加上参数可以指定读取的字符。readline()&#…