C语言版数据结构笔记
现在把以前学的数据结构知识再理一遍,上机测试。首先最重要的是链表。在我看来,链表其实就是由一个个结构体连接而成的,创建一个链表有多种方式,头插法,尾插法等,这里采用的是尾插法。表述有不对的地方,欢迎更正,一起进步。
思路如下:
1.链表的创建
首先,采用尾插法创建一个动态链表,并返回改链表的头结点。
第一步,设置一个头结点head和尾结点tail,刚开始这两个结点的指针域相同;
第二步,去开辟一个新的结点pnew,并为该结点的数据域赋值;
第三步,让尾结点指向新结点,tail->pnew,代码表示即为tail->next=pnew,相当与有一条链子把tail和pnew这两个结点连接起来了;
第四步,既然是尾插法,那么下一个新的结点也是插在尾结点tail的后面啦,经过第三步,可知尾结点变成刚开始的pnew(此时,它才是尾巴!),所以必须将tail变成尾结点,即tail=pnew;
最后最后,一定要让尾结点指向空地址,方便后面的遍历。
2.链表的遍历。
有了头结点(头结点是我们没有预先赋值哦,它的下一个结点才是我们要遍历的第一个结点),我们就可以通过这个头开始按顺序访问链表中的每个结点了,当然,在访问完到最后一个结点时,就停止遍历了,那么停止的条件就是当phead指向空时,所有上面我们为什么要让尾结点指向空。还有一点,phead只是方便遍历这个链表的一个临时结点,如果直接用链表的头结点head来 遍历,下一次对链表进行操作时(遍历,插入,删除等),就很难了,你想想头都不见了,就很尴尬。
3.链表结点的删除
定义两个相邻的指针p1和p2分别指向链表head的head->next,根据自己想要删除结点的位置,这两个指针进行移动(始终相邻),最后p2指向的结点即为将要删除的结点。
4.链表结点的添加
先去创造一个新的结点pnew,也定义两个相邻的指针p1和p2指向链表head和head->next,同理进行移动,然后只需在p1和p2中间插入新节点,很简单,就是让p1->next为pnew,pnew->next为p2
5.链表结点的修改
相对于前面的删除、添加,这个操作更简单。只需定义一个指针p,根据需要修改的地方进行移动,移动到待修改的结点,改变其数据域即可。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int NodeNum = ; //统计结点个数
typedef struct Node
{
int data;
struct Node* next;
}NODE,*PNODE; //创建一个动态链表并返回其头指针
PNODE CreatList()
{
printf("输入数据,以0结束输入\n");
PNODE head = (PNODE)malloc(sizeof(NODE));
PNODE tail = head;
int num = ;
int Flag = ;
scanf("%d", &num);
//输入数据,以0结束
while (num)
{
PNODE pnew = (PNODE)malloc(sizeof(NODE));
pnew->data = num;
tail->next = pnew;
tail = pnew;
NodeNum++;
scanf("%d", &num);
} tail->next = NULL;
return head;
}
//遍历链表
void tarverse(PNODE head)
{
PNODE phead = head->next;
while (phead != NULL)
{
printf("%d ", phead->data);
phead = phead->next;
}
printf("一共有%d个结点\n", NodeNum);
}
//判断是否为空链表
bool isEmpty(PNODE head)
{
if (head->next = NULL)
{
printf("链表为空\n");
return true;
}
else
return false;
}
//删除结点
void DelNode(PNODE head)
{
int location = ;
printf("删除第几个结点?");
scanf("%d", &location);
PNODE p1 = head;
PNODE p2 = p1->next;
for (int i = ; i < location-; i++)
{
p1 = p1->next;
p2 = p2->next;
}
p1->next = p2->next;
free(p2);
p2 = NULL;
NodeNum--;
}
//增加结点
int AddNode(PNODE head)
{
PNODE p1 = head;
PNODE p2 = p1->next;
int location = ;
int newdata = ;
printf("添加在第几个位置?");
scanf("%d", &location);
printf("输入新结点数据:");
scanf("%d", &newdata);
PNODE pnew = (PNODE)malloc(sizeof(NODE));
pnew->data = newdata;
for (int i = ; i < location - ; i++)
{
p1 = p1->next;
p2 = p2->next;
}
p1->next = pnew;
pnew->next = p2;
NodeNum++;
return ;
}
//修改结点
int AlterNode(PNODE head)
{
PNODE p = head;
int location = ;
int newdata = ;
printf("修改第几个结点?");
scanf("%d", &location);
printf("输入新结点数据:");
scanf("%d", &newdata);
PNODE pnew = (PNODE)malloc(sizeof(NODE));
pnew->data = newdata;
for (int i = ; i < location; i++)
{
p = p->next;
}
p->data = newdata;
return ;
}
int main()
{
PNODE p= (PNODE)malloc(sizeof(NODE));
p = CreatList();
tarverse(p);
DelNode(p);
tarverse(p);
AddNode(p);
tarverse(p); system("pause");
return ;
}
C语言版数据结构笔记的更多相关文章
- C语言版数据结构算法
C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- 数据结构(c语言版)代码
第1章 绪论 文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论 概述 第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...
- 插曲一--记《数据结构与问题求解(Java语言版)(第4版)》翻译问题
在该书的527页中18.6理论题中,书中这样写道"完全结点是指每个结点都有两个孩子.证明,完全二叉树的结点数加1等于叶子树." 初看此题目,本人觉得很纳闷,再细细想之,发现似乎是个 ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 从零开始系列-R语言基础学习笔记之二 数据结构(二)
在上一篇中我们一起学习了R语言的数据结构第一部分:向量.数组和矩阵,这次我们开始学习R语言的数据结构第二部分:数据框.因子和列表. 一.数据框 类似于二维数组,但不同的列可以有不同的数据类型(每一列内 ...
随机推荐
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
1.index.wxml <!--index.wxml--> <button style="margin:30rpx;" bindtap="choose ...
- Matlab Tricks(二十)—— Hilbert matrix 的创建
Hij=1i+j−1 N = 5; A = ones(N, 1)*(1:N); B = A'; H = 1./(M+N-1);
- Matlab随笔之分段线性函数化为线性规划
原文:Matlab随笔之分段线性函数化为线性规划 eg: 10x, 0<=x<=500 c(x)=1000+8x, 500<=x<=1000 300 ...
- explicit:C++规定,当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换
explicit研究 explicit是C++中的关键字,不是C语言中的.英文直译是“明确的”.“显式的”意思.出现这个关键字的原因,是在C++中有这样规定的基础上:当定义了只有一个参数的构造函数 ...
- 最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存
申请效率的比较 栈:由系统自动分配,速度较快.但程序员是无法控制的. 堆:是由new分配的内存,最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保 ...
- KEIL MDK编译后的代码量和RAM使用详解
一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘.编译器会将一个程序分为好几个部分,分别存储在 MCU 不同的存储区.Keil 工程在编译完 ...
- HTML5离线缓存攻击测试(二)
经过昨天的测试,发现使用离线缓存的网站会被攻击.但是,不使用离线缓存的网站就真的不会受到这样的攻击么? 据我理解,按照标准当浏览器请求manifest文件时,若没有请求到,或者文件发生改变,应当不使用 ...
- RedHat 7.3+ORACLE 12c RAC 使用udev绑定磁盘
在RedHat 7中,很多命令发生了改变,其中使用udev对磁盘绑定的命令也发生了变更,不再使用start_udev,而是改为了udevadm,下面具体介绍如何使用udev对磁盘进行绑定,这里对6和7 ...
- UWP-标题栏”后退“按钮
原文:UWP-标题栏"后退"按钮 标题栏”后退“按钮,系统级导航 应用必须启用所有硬件和软件系统后退按钮的后退导航.执行此操作的方法是注册 BackRequested 事件的侦听器 ...
- 中国2017 Google 开发者大会第一天简单回顾
昨天有幸参加了中国2017 Google 开发者大会,在这第一天就收获满满,昨天太忙了,今天早晨来一起简单回顾一下,可以让没有参加的童鞋们感受一下现场的温度. 早早就来到了会议现场,外面看不出什么特别 ...