c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表
定义:线性表是具有相同特性的数据元素的一个有限序列
类型:
1:顺序存储结构
定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
算法:
#include <stdio.h>
#define LIST_INIT_SIZE 100
#define ERROR 0
#define OK 1 typedef struct{
// 线性表的顺序存储结构
int numbers[LIST_INIT_SIZE];
int length;
}Sqlist;
int ListInsert_Sq(Sqlist * sl,int i,int number);
int ListDelete_Sq(Sqlist * sl,int i);
int main(void){
Sqlist x;
x.numbers[] = ;
x.numbers[] = ;
x.numbers[] = ;
x.length = ; printf("数组长度:%d\n",x.length);
// 插入线性表 在1的位置插入值5
ListInsert_Sq(&x,,);
printf("数组长度:%d\n",x.length);
ListDelete_Sq(&x,);
printf("数组长度:%d\n",x.length);
} // 插入算法
int ListInsert_Sq(Sqlist * sl,int i,int number){
if(i < || i >= sl->length){
return ERROR;
}
int y;
for(y = sl->length;y < i; y--){
sl->numbers[y] = sl->numbers[y-];
}
sl->numbers[i] = number;
++sl->length;
return OK;
}
// 删除算法
int ListDelete_Sq(Sqlist * sl,int i){
if(i < || i >= sl->length){
return ERROR;
}
int y;
for(y = i;y < sl->length; y++){
sl->numbers[y] = sl->numbers[y+];
}
--sl->length;
return OK;
}
2:链式存储结构
定义:节点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
类型:
单链表:节点只有一个指针域的链表,称为单链表。
单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名
双链表:节点有两个指针域的链表
循环链表:首尾相接的链表
单链表算法:
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1 typedef struct Londe{ // 声明节点的类型和指向节点的指针类型
int number; // 节点的数据与
struct Londe *next; // 节点的指针域
}Londe;
typedef Londe *LinkList; // LinkList为指向结构体 Londe 的指针类型
// 初始化单链表
int initList_L(LinkList *L);
// 清除单链表
int ClearList_L(LinkList L);
// 销毁链表
int DestoryList_L(LinkList *L);
// 获取链表长度
int GetLength_L(LinkList L);
// 通过数据域获取链表索引
int GetDataByI_L(LinkList L,int i);
// 删除指定索引
int DeleteIList_L(LinkList *L,int i);
// 在指定索引上插入数据
int InsertList_L(LinkList *L,int i,int number);
// 遍历链表
int ShowKist_L(LinkList L);
int main(void){
// 头指针
LinkList list = NULL;
initList_L(&list); //ClearList_L(list);
//printf("%p",list);
//DestoryList_L(&list);
//printf("%p",list);
//printf("表长:%d",GetLength_L(list));
//printf("第0个的值%d",GetDataByI_L(list,0));
//ShowKist_L(list); InsertList_L(&list,,);
InsertList_L(&list,,);
InsertList_L(&list,,);
DeleteIList_L(&list,);
ShowKist_L(list); }
// 初始化单链表
int initList_L(LinkList *link){
LinkList node = (LinkList)malloc(sizeof(Londe));
if(!node){
return ERROR;
}
node->number = ;
node->next = NULL;
*link = node;
return OK;
}
// 清除单链表
int ClearList_L(LinkList L){
if(!L) {
return ERROR;
}
LinkList per,next;
per = L->next;
while(per){
next = per->next;
free(per);
per = next;
}
L->next = NULL;
return OK;
}
// 销毁单链表
int DestoryList_L(LinkList *L){
LinkList p;
while(*L){
p = *L;
*L = (*L)->next;
free(p);
}
return OK;
}
// 求单链表的表长
int GetLength_L(LinkList L){
int length = ;
while(L){
length++;
L = L->next;
}
return length;
}
// 取第i个元素的值
int GetDataByI_L(LinkList L,int i){
// 判断大小
if(i < || GetLength_L(L) <= i){
return ERROR;
}
int index = ;
while(L){
if(index == i){
return L->number;
}
index++;
L = L->next;
}
return ERROR;
}
// 遍历
int ShowKist_L(LinkList L){
int i = ;
while(L) {
printf("第%d个,值%d \n",i,L->number);
L = L->next;
i++;
}
return ;
}
// 在第i个节点插入新节点
// 如果i是0,则插在最后
// 如果i是 GetLength_L(L),则插在最后面
int InsertList_L(LinkList *L,int i,int number){
if(i < || i > GetLength_L(*L)){
printf("i:%d;length:%d",i,GetLength_L(L));
return ERROR;
}
int index = ;
LinkList prev = NULL;
LinkList next = NULL;
LinkList x = *L;
while(x){
if(index == i-){
prev = x;
}
if(index == i){
next = x;
}
x = x->next;
index++;
}
LinkList node = (LinkList)malloc(sizeof(Londe));
node->number = number;
node->next = NULL;
if(prev){
node->next = prev->next;
prev->next = node; }else{
*L = node;
} return OK;
}
// 删除第i个节点
int DeleteIList_L(LinkList *L,int i) {
if(i < || i > GetLength_L(L)){
return ERROR;
}
int index = ;
LinkList prev = NULL,now = NULL;
LinkList x = *L;
while(x){
// 前一个
if(index == i-){
prev = x;
}
// 当前个
if(index == i){
now = x;
}
index++;
x = x->next;
}
prev->next = now->next;
if(prev) {
prev->next = now->next;
}else{
*L = now->next;
}
free(now);
return OK; }
c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)的更多相关文章
- java资料——顺序存储结构和链式存储结构(转)
顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺 点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...
- C语言实现链表(链式存储结构)
链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- c数据结构 -- 线性表之 复杂的链式存储结构
复杂的链式存储结构 循环链表 定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环) 优点:从表中任一节点出发均可找到表中其他结点 注意:涉及遍历操作时,终止条件是判断 ...
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
随机推荐
- Qt文件发布
1.打开Qt文件夹下的,其他版本可能为Qt (版本号)for Desktop cmd 2.将Release文件下的exe文件复制到别的文件夹,我这里为G:\Qt\QT_project\ff 3.在Qt ...
- 三种比较好玩的黑客效果JS代码(摘取)
<html> <head> <title>The Matrix</title> <script src="http://ajax.goo ...
- vsftp安装及配置
一.安装Vsftp 1,安装 yum install vsftpd -y
- Java设计模式(一)UML总结
定义 统一建模语言(英语: Unified Modeling Language ,缩写UML)是非专利的第三代建模和规约语言. UML特点 UML是一种开放的方法 用于说明.可视化.构建和编写一个正在 ...
- Deepin Linux下安装安卓应用的各种方式
没事啥折腾 Deepin Linux 的应用商店里集成了挺多安卓应用 , 没有的就只能自己想办法了. 我主要使用这几个app , 飞书,邮箱大师,还有一些公司内部app. 网上 搜索了一下 ,有以下几 ...
- Linux环境搭建及基础操作
一.Linux环境搭建 1.安装虚拟机软件(VMWare,Parallel) 虚拟机的作用:将本来不是适合当前操作系统的分区虚拟化成适合当前操作系统的分区格式 2.新建虚拟机: 类似买了一台新的电脑, ...
- 请求 - Fetch(未完)
概念和用法 可以被使用到更多地应用场景中:无论是service workers.Cache API.又或者是其他处理请求和响应的方式,甚至是任何一种需要你自己在程序中生成响应的方式. Cache 接口 ...
- docker下载镜像太慢的解决方案
参考链接:https://blog.csdn.net/weixin_43569697/article/details/89279225 docker下载镜像卡死或太慢找了网上很多方法,使用镜像中国也是 ...
- 对主定理(Master Theorem)的理解
前言 虽说在学OI的时候学到了非常多的有递归结构的算法或方法,也很清楚他们的复杂度,但更多时候只是能够大概脑补这些方法为什么是这个复杂度,而从未从定理的角度去严格证明他们.因此借着这个机会把主定理整个 ...
- 532-数组中的K-diff数对
532-数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组 ...