什么是数据结构
1、定义:研究数据和数据之间关系的一门学科
2、定义一个好的程序
简洁,高效,稳定,内存
算法:增,删,改,查
3、解决某一问题的具体步骤
特点:输入,输出,确定性,有穷性
评判:高效(时间复杂度),空间(空间复杂度),简洁,
4、如何计算时间复杂度:
1.求出时间频度的等式 (多项式求和)
2.保留最高次数项
3.系数化为
1
分类
逻辑结构:
集合:
- 有序集合,无序集合
线形:首节点没有直接前驱,尾节点没有直接后继,其余节点有且只有一个前驱和后继
- 表,栈,队列
树形:有且只有一个根节点,根节点没有直接前驱,有n
个后继(
n>=0
)
,
其他节点有且只
有一个前驱,
和
n
个后继(
n>=0
)
;
- 二叉树(平衡二叉树,红黑树,A树,B树。。。)
图形,
节点可以有多个前驱和后继
- 有向图,无向图,带权图,不带权图。。。
存储结构:
顺序存储:存储地址是连续的,数组,malloc
链式存储:链式存储
数据:
定义:可以被计算机识别,处理,运算的符号统称数据数据项组成数据元素,数据元素组成数据
线性表
1、逻辑结构:线形
2、存储结构:顺序表,链表
3、顺序表:
优点:简单,查找和修改非常快捷
缺点:大小固定的,浪费空间,插入和删除比较费力
4、链表:
- 单向不循环链表
头节点的作用是同意插入代码,头插代码可以替换尾插代码
头查时注意,必须先连后一根线
末尾节点指向NULL
特点:只能向一个方向遍历
- 单项循环链表
可以通过循环方式找到前面的节点
末尾节点指向头节点
- 双向链表
可以通过pre
指针找到前面的节点
末尾节点指向NULL
- 双向循环链表
末尾节点指向头节点
顺序表
头文件:
#ifndef _SQLISTE_H
#define _SQLISTE_H
//定义数组大小
#define SIZE 1024
//定义顺序表数据
typedef int sql_data_t;
//定义顺序表的类型
typedef struct sqliste{
sql_data_t data[SIZE];
int len;
}sql_node,* sql_pnode;
//创建
sql_pnode create_sqliste();
//插入
int insert_sqliste(sql_pnode L, sql_data_t data, int index);
//判满
int full_sqliste(sql_pnode L);
//打印顺序表
int show_sqliste(sql_pnode L);
//删除 按值删除
int delete_sqliste(sql_pnode L, sql_data_t data);
//判空
int empty_sqliste(sql_pnode L);
//清空
int clean_sqliste(sql_pnode L);
//修改 按位置修改
int change_sqliste(sql_pnode L, int index, sql_data_t data);
//查询 按位置查值
sql_data_t research_sqliste(sql_pnode L, int index);
//销毁 free 主函数的L指向NULL
int destory_sqliste(sql_pnode *L);
#endif
函数功能实现:创建 销毁 增 删 查 改 ......
#include "sqliste.h"
#include <stdlib.h>
#include <stdio.h>
sql_pnode create_sqliste()
{
//创建顺序表的空间
sql_pnode L = (sql_pnode)malloc(sizeof(sql_node));
if(NULL == L)
{
return NULL;
}
//顺序表做初始化
L->len = 0;
return L;
}
//插入
int insert_sqliste(sql_pnode L, sql_data_t data, int index)
{
//判断L是否有效
if(NULL == L)
return -1;
//判满
if(0 == full_sqliste(L))
return -2;
//判断插入位置 小于0 大于len
if((index < 0 ) || (index > L->len))
return -3;
//从最后一个元素开始依次向后移动一位
//指针写法
/*
data_t *start = L->data + index;
data_t *end = L->data + len-1;
while(end >= start)
{
*(end+1) = *end;
end--;
}
*/
//数组写法
int i;
for(i = L->len-1; i >= index; i--)
{
L->data[i+1] = L->data[i];
}
//插入
L->data[index] = data;
L->len++;
return 0;
}
//判满
int full_sqliste(sql_pnode L)
{
if(NULL == L)
return -1;
if(L->len == SIZE)
return 0;
else
return 1;
}
//打印顺序表
int show_sqliste(sql_pnode L)
{
if(NULL == L)
return -1;
int i;
for(i = 0; i < L->len; i++)
{
printf("data[%d]=%d ", i, L->data[i]);
}
puts("");
return 0;
}
int empty_sqliste(sql_pnode L)
{
if(NULL == L)
return -1;
if(0 == L->len)
return 0;
else
return 1;
}
//清空
int clean_sqliste(sql_pnode L)
{
if(NULL == L)
return -1;
L->len = 0;
return 0;
}
//修改 按位置修改
int change_sqliste(sql_pnode L, int index, sql_data_t data)
{
if(NULL == L)
return -1;
if(index < 0 || index > L->len-1)
return -2;
L->data[index] = data;
return 0;
}
//查询 按位置查值
sql_data_t research_sqliste(sql_pnode L, int index)
{
if(NULL == L)
return -1;
if(index < 0 || index > L->len-1)
return -2;
return L->data[index];
}
//删除 按值删除
int delete_sqliste(sql_pnode L, sql_data_t data)
{
if(NULL == L)
return -1;
if(0 == empty_sqliste(L))
return -2;
//找到data 的下标
int i,j;
int flag = 0;
for(i = 0; i < L->len; i++)
{
if(L->data[i] == data)
{
flag ++;
//删除下标为i的值
for(j = i; j < L->len; j++)
{
L->data[j]=L->data[j+1];
}
L->len--;
i--; //如果删除之后直接i++会跳过一个元素
}
}
if(0 == flag)
return -3;
else
return flag;
}
//销毁 free 主函数的L指向NULL
int destory_sqliste(sql_pnode* L)
{
if(NULL == *L)
return -1;
//释放空间
free(*L);
//mian函数的L指向空
*L = NULL;
return 0;
}
测试主函数main:
#include <stdio.h>
#include "sqliste.h"
int main()
{
sql_pnode L = create_sqliste();
if(NULL == L)
{
printf("create is default\n");
return -1;
}
puts("insert 0-5 index=2 data=520 index=3 data=520 ");
int i;
for(i = 0; i < 6; i++)
{
if(0 != insert_sqliste(L, i, i))
{
printf("insert is default\n");
return -1;
}
}
if(0 != insert_sqliste(L, 520, 2))
{
printf("insert is default\n");
return -1;
}
if(0 != insert_sqliste(L, 520, 2))
{
printf("insert is default\n");
return -1;
}
if(0 != show_sqliste(L))
{
printf("show is default\n");
return -1;
}
puts("delete data=520 ");
if(0 >= delete_sqliste(L,520))
{
printf("delete is default\n");
return -1;
}
if(0 != show_sqliste(L))
{
printf("show is default\n");
return -1;
}
puts("research index=3 ");
sql_data_t data;
if(0 > (data=research_sqliste(L, 3)))
{
printf("research is default\n");
return -1;
}
printf("data=%d\n", data);
puts("clean");
if(0 != clean_sqliste(L))
{
printf("clean is default\n");
}
if(0 != show_sqliste(L))
{
printf("show is default\n");
return -1;
}
puts("destory");
if(0 != destory_sqliste(&L))
{
printf("destory is default\n");
return -1;
}
if(0 != show_sqliste(L))
{
printf("show is default\n");
return -1;
}
return 0;
}
链表 (单向链表)
头文件:
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef int data_t;
typedef struct linklist
{
data_t data;
struct linklist* next;
}lk_node,*lk_pnode;
//
lk_pnode creat();
//
int len_linklist(lk_pnode H);
//
int insert_linklist(lk_pnode H,int location,data_t data);
//
int del_linklist(lk_pnode H,int location);
int delall_linklist(lk_pnode);
//
int cover_linklist(lk_pnode,int location,data_t data);
//
int inquire_linklist(lk_pnode H,int location);
//
int destory_linklist(lk_pnode* H);
//
void show_linklist(lk_pnode H);
//
int updown_linklist(lk_pnode H);
//
int inquireval_linklist(lk_pnode H,data_t data);
//
int sort_linklist(lk_pnode H);
#endif
函数功能实现:创建 销毁 增 删 查 改 .....
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
//---------------------------------------------------
lk_pnode creat()
{
lk_pnode H = (lk_pnode)malloc(sizeof(lk_node));
if( NULL==H )
return NULL;
H->next = NULL;
return H;
}
//--------------------------------------------------
int cover_linklist(lk_pnode H,int location,data_t data)
{
if(NULL==H)
return -1;
if(location<0 || location>len_linklist(H))
return -2;
while(location)
{
H=H->next;
location--;
}
H->next->data = data;
return 0;
}
//---------------------------------------------------
int len_linklist(lk_pnode H)
{
if(NULL==H)
return -1;
int len = 0;
while(H->next != NULL)
{
H=H->next;
len++;
}
return len;
}
//---------------------------------------------------
int del_linklist(lk_pnode H,int location)
{
if(NULL == H)
return -1;
if(location < 0 || location > len_linklist(H))
return -2;
while(location)
{
H=H->next;
location--;
}
lk_pnode b = H->next;
H->next = H->next->next;
free(b);
return 0;
}
//----------------------------------------------------
int delall_linklist(lk_pnode H)
{
if(NULL==H)
return -1;
if(0 == len_linklist(H))
return -2;
while(H->next != NULL)
{
lk_pnode B = H->next;
H->next = B->next;
free(B);
}
return 0;
}
//----------------------------------------------------
int insert_linklist(lk_pnode H,int location,data_t data)
{
if(NULL==H)
return -1;
if(location<0 || location>len_linklist(H))
return -2;
while(location)
{
H = H->next;
location--;
}
lk_pnode in = (lk_pnode)malloc(sizeof(lk_node));
in->next = H->next;
H->next = in;
in->data = data;
return 0;
}
//----------------------------------------------------
int inquire_linklist(lk_pnode H,int location)
{
if(NULL==H)
return -1;
if(location<0 || location> len_linklist(H))
return -2;
while(location)
{
H=H->next;
location--;
}
return H->next->data;
}
//----------------------------------------------------
int destory_linklist(lk_pnode* H)
{
if(NULL == H)
return 0;
free(*H);
return 0;
}
//-----------------------------------------------------
void show_linklist(lk_pnode H)
{
while(H->next != NULL)
{
H=H->next;
printf("%d ",H->data);
}
puts("");
}
//-----------------------------------------------------
int updown_linklist(lk_pnode H)
{
if(NULL==H)
return -1;
if(0 == len_linklist(H))
return -2;
lk_pnode E = H->next;
H->next=NULL;
while(E)
{
lk_pnode B = E;
E=E->next;
B->next=H->next;
H->next=B;
}
return 0;
}
//--------------------------------------------------------
int inquireval_linklist(lk_pnode H,data_t data)
{
if(NULL==H)
return -1;
int scor = 0;
int dex = 0;
while(H->next != NULL)
{
H=H->next;
if(H->data == data)
{
scor++;
printf("......下标%d的值为%d\n",dex,data);
// show_linklist(H,dex);
}
dex++;
}
if(0==scor)
return -2;
return 0;
}
//----------------------------------------------------------
int sort_linklist(lk_pnode H)
{
if(NULL==H)
return -1;
if(0 == len_linklist(H))
return -2;
lk_pnode B = H->next;
lk_pnode E = B;
lk_pnode temp = H;
H->next = NULL;
while(B)
{
E = B;
B = B->next;
temp = H;
while(temp->next)
{
if(temp->next->data > E->data)
break;
temp = temp->next;
}
E->next = temp->next;
temp->next = E;
}
return 0;
}
测试主函数main:
#include <stdio.h>
#include "linklist.h"
int main()
{
lk_pnode H = creat();
if(NULL == H)
printf("......创建失败\n");
else
printf("......创建成功\n");
//----------------------------------
for(int i=0;i<6;i++)
{
if(0 != insert_linklist(H,i,i+1))
printf("......插入失败\n");
else
printf("......将%d插入到%d号位置成功\n",i+1,i);
}
show_linklist(H);
//--------------------------------------
if(0 != cover_linklist(H,2,99))
printf("......修改失败\n");
else
printf("......修改成功 ");
show_linklist(H);
//--------------------------------------
printf("......2号位是%d\n",inquire_linklist(H,2));
if(-2==inquireval_linklist(H,99))
printf("链表中没有99这个值\n");
//--------------------------------------
updown_linklist(H);
show_linklist(H);
//--------------------------------------
if(0 == sort_linklist(H))
printf("......逆序成功 ");
show_linklist(H);
//--------------------------------------
if(0 != del_linklist(H,2))
printf("......删除失败\n");
else
printf("......删除2号位成功 ");
show_linklist(H);
//---------------------------------------
if(0 != delall_linklist(H))
printf("......清空失败\n");
else
printf("......清空成功\n");
show_linklist(H);
//-------------------------------------------
if(0 != destory_linklist(&H))
printf("......销毁失败\n");
else
printf("......销毁成功\n");
return 0;
}