|
程序中的数据结构
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 50
struct SqList
{
/* data */
ElemType* elem; // addr
int length; //当前长度
int listsize; //容量,最大可存长度,以sizeof(ElemType)为单位
};
这种结构是与存储结构一一对应的,比如elem是一个指针/地址数据,就是一个地址,
后面跟两个int类型的数据,
看到这个结构,脑海中要想到它在计算机中是如何存储的,
- 数据类型是什么
- 占多少个字节
也就是说,逻辑结构与存储结构是分不开的,具有强关联
什么是算法 计算方法 计算 数据 的方法 计算机 计算 数据 的方法 这个数据指计算机中的数据,这个方法也是计算机中的方法 什么是数据 计算机中的数据是什么? 最底层由0与1组成,大致分为整数,小数,总之,就是 数/数字/数值 1,2,3,0.1,0.3 等等都是计算机中的数,也是数据 自然界中结构
三角形结构,就是三条线段首尾相连形成的结构
线,大马路左拐右拐,连通两个地方,这两个地方之间就是线型/线性结构
树,一根线有很多枝
一类事物都能抽象出一个结构出来,比如人体结构,树的结构,道路的结构
万物有类别,有结构,对应哲学上那句“万物有特性,也有共性”
这里用线来描绘万物的共性,就跟用画描绘世界差不多,画的就是这世界的结构...
结构是一个事物抽象出来的虚拟线性框架
(不是线也行,比如断续的点或其他的,比如泼墨也能出画,但线可以表示这个....
线 是一种表示方法上,但不是唯一表示结构的方法)
了解了一类事物的结构,就容易抓住其本质/把握其规律
计算机中数据的结构 计算机可以模拟/表述世界,比如,声音,图像,影视等, 这些也叫数据 这些数据对应着现实世界的人与物 这些数据在计算机中有 “结构”:主要有 物理结构:静态存储结构,断电也还在 逻辑结构:内存中的结构,断电就没了
|
1. 数组(Array)
2. 链表(Linked List)
3. 栈(Stack)
4. 队列(Queue)
5. 树(Tree)
6. 图(Graph)
7. 哈希表(Hash Table)
8. 堆(Heap)
|
|
|
|
|
|
|
link.h
#ifndef LINK_H
#define LINK_H
#define ERROR_VALUE -2147483648 //使用Int最小值做为错误处理
//结点结构体
struct Node{
int data; //数据域
struct Node* next; //指针域
};
//链式队列结构体
typedef struct LQ{
int size; //队列大小
struct Node out; //头结点,本身data不存储数据,仅使用其next,其next永远指向队列的第一个节点
struct Node* in; //尾结点指针,指向队列最后一个节点,其数据就是队列最后一个节点的数据
}LkQueue, *LinkQueue; //定义两个类型,一个LQ结构体,一个LQ结构体指针
LinkQueue init_lq(){
//创建队列结构体
LkQueue* myQueue = (LkQueue*)malloc(sizeof(LkQueue));
if (!myQueue){
return NULL;
}
//初始化队列长度
myQueue->size = 0;
//初始化队列头指针的指针域
myQueue->out.next = NULL;
myQueue->in = &myQueue->out;
return myQueue;
}
void push_lq(LinkQueue queue, int data){
if (!queue){
printf("队列未初始化\n");
return;
}
//创建新结点
struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
if (!newNode){
return;
}
newNode->data = data;
//更新指针的指向
queue->in->next = newNode; //新节点追加到队列尾节点的next上,首先执行就是out->next = newNode
newNode->next = NULL; //newNode成为新的尾节点,其next为NULL
queue->in = newNode; //队列的尾节点后移一位
queue->size++;
}
int pop_lq(LinkQueue queue){
int data = ERROR_VALUE;
if (!queue){
return data;
}
if (queue->size == 0){
printf("空队,无法出队\n");
return data;
}
//记录第一个结点
struct Node* pFirst = queue->out.next;
//更新指针的指向
queue->out.next = pFirst->next;
//队列中只有一个结点的时候,再出队会影响尾指针,需要特判
if (queue->size == 1){
queue->in = &queue->out; //相当于队列空了,没有数据了
}
queue->size--;
//判断结点存在并释放结点
if (pFirst){
data = pFirst->data;
free(pFirst);
}
return data;
}
#endif
main.c
#include <stdio.h>
#include <stdlib.h>
#include "link.h"
int main(){
LinkQueue q = init_lq();
push_lq(q,11);
push_lq(q,12);
push_lq(q,13);
printf("query size = %d\n",q->size);
int data = pop_lq(q);
printf("res1 = %d\n",data);
printf("query size = %d\n",q->size);
data = pop_lq(q);
printf("res2 = %d\n",data);
data = pop_lq(q);
printf("res3 = %d\n",data);
return 0;
}
可以用数组来实现链式队列, 两个指针在有效数据的两端,控制开始结束的位置
C语言-队列
顺序队列详解(C语言实现)