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- ...
随机推荐
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase微博案例
实验目的 熟悉hbase表格设计的方法 熟悉hbase的javaAPI 通过API理解掌握hbase的数据的逻辑视图 了解MVC的服务端设计方式 实验原理 上次我们已经初步设计了学生选课案例的,具体功 ...
- 使用pip安装Python库超时解决办法
如果在国内安装Python库,强烈推荐使用豆瓣的源http://pypi.douban.com/simple/ 可以这样使用 pip install -i http://pypi.douban.com ...
- 转行小白成长路-java篇
第五章:初始化与清理 前几章怎么看都没发现有什么逻辑顺序,感觉都是相互独立的,在讲述java语言构成的基本单位和规则.这个先放置一边. java中初始化有两层含义,其一是创建,二是赋值. 其本质也就是 ...
- Linux系统之网络相关的命令
Linux系统之网络相关的命令 网络概述 网络:通过通信介质和通信设备 将分布不同地点的两台或多台计算机,经过相应的程序实现通信switch 交换机router 路由器网络的功能:数据通信:利用网络传 ...
- CSS3之border-image的使用
最近,我在项目开发中遇到这样的问题. 要给这个tab的底部的蓝线左右加上圆角. 然而,这个元素实际如上图所示,只是active的时候加了个underline的类,蓝线并没有单独的html. 若给这个s ...
- tensorflow张量排序
本篇记录一下TensorFlow中张量的排序方法 tf.sort和tf.argsort # 声明tensor a是由1到5打乱顺序组成的 a = tf.random.shuffle(tf.range( ...
- 嵊州D5T1 鸡翅 chicken
鸡翅 chicken [问题描述] 小 x 非常喜欢小鸡翅. 他得知 NSC 超市为了吸引顾客,举行了如下的活动: 一旦有顾客在其他超市找到更便宜的小鸡翅, NSC 超市将免费送给顾客 1000g ...
- gulp常用插件之gulp-filter使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-filter这是一款可以把stream里的文件根据一定的规则进行筛选过滤. 更多使用文档请点击访问gulp-filter工具官网. 安装 ...
- gulp常用插件之autoprefixer使用
更多gulp常用插件使用请访问:gulp常用插件汇总 autoprefixer这是一款自动管理浏览器前缀的插件,它可以解析CSS文件并且添加浏览器前缀到CSS内容里. 更多使用文档请点击访问autop ...
- Hdu1042 N! (阶乘高精度模板)
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in ...