数据结构
valgrind ./a.out
1.定义
一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)
程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,
并在此基础上实现某个特定的功能的操作;
程序 = 数据结构 + 算法
2.数据与数据之间的关系
数据的逻辑结构:数据元素与元素之间的关系
集合:关系平等
线性结构:元素之间一对一的关系(表(数组,链表),队列。栈。。。)
树型结构:元素之间一对多的关系(二叉树)
图形结构:元素之间多对多的关系(网状结构)
数据的物理结构:数据的逻辑结构在计算机内存中的存储形式
顺序存储:采用一段连续的内存空间保存元素
优点:空间连续,访问方便
缺点:插入删除需要移动大量的元素
需要预分配内存空间
容易造成存储空间碎片
链式存储:采用一组非连续的内存空间保存元素
缺点:访问元素效率低
优点:插入和删除数据方便
不需要预分配内存
索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置
散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对
应关系从而实现查找的存储方式
3. 储备知识
指针
结构体
动态内存分配
main函数
#include "../head.h"
#include "double_link.h"
int main()
{
DouLink *dlink = Created_link();
if(dlink == NULL)
{
return -1;
}
DataType stus[] = {
{1,"zhangsan",18,90},
{2,"lisi",11,70},
{3,"wangwu",28,58},
{4,"maliu",22,60},
};
push_doulink_head(dlink,stus[0]);
push_doulink_head(dlink,stus[1]);
push_doulink_head(dlink,stus[2]);
push_doulink_head(dlink,stus[3]);
push_data_end(dlink,stus[0]);
Transfer_dlink(dlink);
Find_data(dlink,"lisi") ;//查找
// Change_data(dlink,"zhangsan",stus[1]);
// Transfer_dlink(dlink);
destory_dlink(dlink);
}
double_link.c
#include "../head.h"
#include "double_link.h"
DouLink *Created_link() // 创建
{
DouLink *dlink = malloc(sizeof(DouLink));
if(dlink == NULL)
{
perror("create fail");
return NULL;
}
dlink->clen = 0;
dlink->phead = NULL;
return dlink;
}
int push_doulink_head(DouLink *dlink,DataType data) //头插
{
if(NULL == dlink)
return -1;
DouNode *pinsert = malloc(sizeof(DouNode));
if(pinsert == NULL)
{
perror("create fail");
return -1;
}
pinsert->ppre = NULL;
pinsert->pnext =dlink->phead;
pinsert->data = data;
dlink->clen++;
if(dlink->phead != NULL)
{
dlink->phead->ppre = pinsert;
}
dlink->phead = pinsert;
}
int Transfer_dlink(DouLink *dlink) //遍历
{
if(NULL == dlink)
return -1;
DouNode *pnode = dlink->phead;
while(pnode->pnext != NULL)
{
printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
pnode = pnode->pnext;
}
printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
printf("====\n");
/*
while(pnode != NULL)
{
printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
pnode = pnode->ppre;
}
*/
}
int push_data_end(DouLink *dlink,DataType data) //尾插
{
if(dlink == NULL)
return -1;
DouNode *p = dlink->phead;
DouNode *pnode = malloc(sizeof(DouNode));
if(pnode == NULL)
{
perror("malloc fail");
return -1;
}
if(dlink->phead == NULL)
{
pnode->data = data;
pnode->pnext = NULL;
pnode->ppre = NULL;
dlink->phead = pnode;
}
else
{
while(p->pnext != NULL)
{
p = p->pnext;
}
pnode->data = data;
pnode->pnext = NULL;
pnode->ppre = p;
p->pnext = pnode;
}
dlink->clen++;
}
int del_head(DouLink *dlink)//头删
{
if(dlink == NULL || dlink->phead == NULL)
return -1;
DouNode *pnode = dlink->phead;
if(pnode->pnext == NULL)
{
dlink->phead = NULL;
free(pnode);
dlink->clen--;
}
else
{
pnode->pnext->ppre = NULL;
dlink->phead = pnode->pnext;
free(pnode);
dlink->clen--;
}
}
int del_end(DouLink *dlink) // 尾删
{
if(dlink == NULL || dlink->phead == NULL)
return -1;
DouNode *pnode = dlink->phead;
if(pnode->pnext == NULL)
{
free(pnode);
dlink->phead = NULL;
dlink->clen--;
}
else
{
while(pnode->pnext != NULL)
{
pnode = pnode->pnext;
}
pnode->ppre->pnext = NULL;
free(pnode);
dlink->clen--;
}
}
int Change_data(DouLink *dlink , char *name , DataType targe)//制定删除
{
if(dlink == NULL || dlink->phead == NULL)
return -1;
DouNode *p = dlink->phead;
while(p != NULL)
{
if(!strcmp(p->data.name,name))
{
p->data = targe;
return -1;
}
p = p->pnext;
}
}
int Find_data(DouLink *dlink,char *name) //查找
{
if(dlink == NULL || dlink->phead == NULL)
return -1;
DouNode *pnode = dlink->phead;
while(pnode != NULL)
{
if(!strcmp(pnode->data.name,name))
{
printf("查找id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
return -1;
}
pnode = pnode->pnext;
}
printf("No find\n");
return 0;
}
int destory_dlink(DouLink *dlink)
{
if(dlink == NULL || dlink->phead == NULL)
return -1;
while(dlink->phead != NULL)
{
del_head(dlink);
}
free(dlink);
}
/*************************************************************************
> File Name: double_link.h
> Author: yas
> Mail: rage_yas@hotmail.com
> Created Time: Thu 08 Aug 2024 04:19:05 PM CST
************************************************************************/
#ifndef __DOUBLE_LINK_H__
#define __DOUBLE_LINK_H__
typedef struct stu
{
int id;
char name[100];
int age;
int score;
}DataType;
typedef struct node
{
DataType data;
struct node *ppre;
struct node *pnext;
}DouNode;
typedef struct link
{
DouNode *phead;
int clen;
}DouLink;
DouLink *Created_link();
int push_doulink_head(DouLink *dlink,DataType data);
int Transfer_dlink(DouLink *dlink);
int push_data_end(DouLink *dlink,DataType data); //尾插
int del_head(DouLink *dlink);//头删
int del_end(DouLink *dlink) ; // 尾删
int Change_data(DouLink *dlink , char *name , DataType targe);
int Find_data(DouLink *dlink,char *name) ;//查找
int destory_dlink(DouLink *dlink);
#endif