数据结构
逻辑关系:线性关系,树状关系,图形关系,集合关系
存储关系:顺序存储,链式存储。
算法:广义:数据结构算法
狭义:增删改查
--------------------------------------------
线性表(逻辑关系里的线性关系)
1,顺序表
概念:只有一个前驱结点和一个后驱结点 ---- 1对1关系
数据紧挨保存,不能间断,数据保存在同一片空间中
保存:利用堆去保存数据+最大下标遍历
struct {
int *p; //保存堆的地址
int len; //有效数据的下标
int size; //数组元素的总个数
}
顺序表建立
seqlist.h
#ifndef __SEQLIST_H
#define __SEQLIST_H
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
typedef struct{ //关键字 typedef 类型取别名
int *p; 保存堆的地址,用于保存数据
int len; //有效数据的下标
int size; //数组元素的总个数
}seq_t;
extern void seq_init(seq_t *ps);
extern void seq_add(int data,seq_t *ps);
extern void display(seq_t *ps);
#endif
seqlist.c
----开辟堆空间的函数
void seq_init(seq_t *ps){//参数:需要把堆空间的返回,保存在结构体的某个成员中,所以需要传入结构体
ps->size=SIZE;//确保你堆空间的大小//数据的个数的
ps->p=(int *)malloc(ps->size * sizeof(int));//sizeof(int) 4个字节
//将malloc开辟的空间返回时强转成int *类型,和p同类型接收
if(ps->p==NULL){
printf("迎面走来得你让我蠢蠢欲动\n");
return;
}
ps->len=-1;//刚申请下来的空间,没有数据,所以不需要下标
}
//添加数据---->要将数据添加入结构体的ps->p中 //分析参数: 数据:data ps->p:ps
void seq_add(int data,seq_t *ps){
//问题:我们当前的ps->p 只声明了20个字节,只能存5个整数 如果我们的数据超过5个呢?
//判断是否存满数据
//制作一个中间变量,暂时保留某些操作
int *temp;
if(ps->len==ps->size-1){
//扩容操作
ps->size +=SIZE;//ps->size=ps->size+SIZE
temp=(int *)realloc(ps->p,ps->size * sizeof(int));//重新调整堆空间的
if(temp==NULL){
printf("这种感觉我从未有过\n");
return;
}
ps->p=temp;
printf("扩容成功\n");
}
ps->len++;//下标移动
ps->p[ps->len]=data;//根据下标移动查找赋值空间
}
//遍历操作
void display(seq_t *ps)
{
printf("遍历结果是:");
int i;//for循环的依据
for(i=0;i<=ps->len;i++){
printf("%d ",ps->p[i]);
}
printf("\n");
}
#include "seqlist.h"
int main(){
//1>增删改查?
//前提:开辟堆空间
seq_t seq;
seq_init(&seq);//函数使用:第一准则:看参 第二准则:看返
printf("水一方沐足店欢迎您,尊贵tonly VIP\n");
//2>增操作
int data;//用于保存输入的数据
int temp;
while(1){
temp=scanf("%d",&data);
if(temp==0){
break;
}
seq_add(data,&seq);
display(&seq);
}
return 0;
}
链表
单向链表
1>概念:
只有一个前驱结点和一个后驱结点,
每个节点都保存下一个节点的地址,拥有一个没有数据域的头结点
PS: 物理空间上不连续,代码逻辑上连续
结构体形状:
前驱结点和一个后驱结点,节点都保存下一个节点的地址
struct xx{
int data; //数据域
struct xx *next;//下一个结点的地址
}
3>PS:
link.h 头文件以及函数声明
link.c 函数制作
main.c 函数调用以及代码逻辑