华清远见嵌入式学习day08——线性表
【线性表】
线性表的特征:
1) 对非空表,a0是表头,无前驱;
2) an-1是表尾,无后继;
3) 其它的每个元素ai有且仅有一个直接前驱(ai-1)和一个直接后继(ai+1)。
【顺序存储结构】
数组 空间先固定好, 连续存储
优点:遍历(查找)方便;
不足:插入和删除时间复杂度差;
一种模型【顺序表】
#define N 10
struct list{
char data[N];
int last;
};
改进:
#define MAXSIZE 10
typedef int datatype;
typedef int postype;
typedef struct list{
datatype data[MAXSIZE];
postype last;
}Seqlist, * Seqlist_p;
创建空表函数
Seqlist_p CreateSeqList(void);
Seqlist_p CreateSeqList(void){
//1. NULL;
Seqlist_p L = NULL;
//Seqlist_p L = (Seqlist *)malloc(sizeof(Seqlist));//bug
//2. malloc 设置空表标志;
L = (Seqlist *)malloc(sizeof(Seqlist));//!sizeof
if(NULL == L){
printf("creat error!\n");
return NULL;
}
L->last = -1;
return L;
}
课堂实现:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef int datatype;
typedef int postype;
//typedef int * p;
typedef struct list{
datatype data[MAXSIZE];
postype last;
}Seqlist, * Seqlist_p;
Seqlist_p CreateSeqList(void);
void ClearSeqList(Seqlist_p L);
int InsertSeqList(Seqlist_p L, datatype x, postype pos);
int IsFullSeqList(Seqlist_p L);
void ShowSeqList(Seqlist_p L);
int IsEmptySeqList(Seqlist_p L);
int DeleteSeqList(Seqlist_p L, postype pos);
void FreeSeqList(Seqlist_p *L);
int LengthSeqList(Seqlist_p L);
datatype GetSeqList(Seqlist_p L, postype pos);
postype LocateSeqList(Seqlist_p L, datatype x);
作业:顺序表,两个表合并;
有数据表两个, 分别为LA, LB;
LA = {1,3,6,8,10};
LB = {1,3,7,9,10};
实现:LA = LA U LB;
void UnionSeqList(Seqlist_p L1, Seqlist_p L2){
if( NULL == L1 || NULL == L2){
printf("L is NULL\n");
return;
}
int i, x, k;
for(i = 0; i < LengthSeqList(L2); i++){
x = GetSeqList(L2, i);
if( (k = LocateSeqList(L1, x)) == -1){
InsertSeqList(L1, x, 0);
}
}
return;
}
【链式存储结构】
模型一【单链表】
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node * next;
}Linknode, * Linklist;
Linklist CreateLinkList();
int HeadInsertLinkList(Linklist H, datatype x);
void ShowLinkList(Linklist H);
Linklist GetLinkList(Linklist H, int pos);
Linklist LocateLinkList(Linklist H, datatype value);
int InsertLinkList(Linklist H, int pos, datatype x);
int DeleteLinkList(Linklist H, int pos);
#endif
模型二【单向循环链表】
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node * next;
}Linknode, * Linklist;
Linklist CreateLinkList();
#endif
Linklist CreateLinkList(){
Linklist H = NULL;
H = (Linknode *)malloc(sizeof(Linknode));
if(NULL == H){
printf("create malloc error!\n");
return NULL;
}
H->data = 0;
H->next = H;
return H;
}
模型三【双向循环链表】
#ifndef __DLINKLIST_H__
#define __DLINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct dnode{
datatype data;
struct dnode * prior;
struct dnode * rear;
}DLinknode, * DLinklist;
DLinklist CreateDLinkList();
int InsertDLinkList(DLinklist H, datatype x);
int DeleteDLinkList(DLinklist H);
void ShowDLinkList(DLinklist H);
#endif
DLinklist CreateDLinkList(){
DLinklist H = NULL;
H = (DLinknode *)malloc(sizeof(DLinknode));
if(NULL == H){
printf("create malloc error!\n");
return NULL;
}
H->data = 0;
H->prior= H;
H->rear = H;
return H;
}
int InsertDLinkList(DLinklist H, datatype x){
if(NULL == H){
return -1;
}
DLinklist new = NULL;
new = (DLinknode *)malloc(sizeof(DLinknode));
if(NULL == new){
return -1;
}
new->data = x;
new->rear = H->rear;
new->prior = H;
(new->rear)->prior = new;
(new->prior)->rear = new;
return 0;
}
int DeleteDLinkList(DLinklist H){
if(NULL == H){
return -1;
}
DLinklist p = H->rear;
(p->rear)->prior = H;
(p->prior)->rear = p->rear;
free(p);
p = NULL;
return 0;
}
void ShowDLinkList(DLinklist H){
if(NULL == H){
return;
}
#if 1
DLinklist p = H;
while(p->rear != H){
p = p->rear;
printf("%d\n", p->data);
}
#else
while(H->rear != H){
H = H->rear;
printf("%d\n", H->data);
}
#endif
}
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- 温故而知新:设计模式之工厂模式(Factory)
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- jquery.mobile手机网页简要
- 跟张志东深聊腾讯的“进化力”
- 详解微信小程序如何实现流程进度功能
- silverlight:如何在图片上挖个洞?
- .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
- mysqldump数据导出问题和客户端授权后连接失败问题
- Android置底一个View后运行报错
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
- ubuntu安装多个版本的CUDA并随时切换
- 如何在Ubuntu 18.04(实体机)上配置OpenWRT的开发环境
- Android 组合控件实现布局的复用的方法
- Android编程实现播放音频的方法示例
- 使用VSCode的Remote-SSH连接Linux进行远程开发
- Android ListView之EfficientAdapte的使用详解
- JavaScript:ECMAScript 2020中的新增功能
- Android编程实现播放视频的方法示例
- Android开发之RadioGroup的简单使用与监听示例
- Android 根据手势顶部View自动展示与隐藏效果
- Vue 3 如何安装
- Android实现状态栏(statusbar)渐变效果的示例
- Linux中stat函数和stat命令使用详解
- Android Beam 文件传输失败分析与解决方法