数据结构(data structure)是带有结构特性的数据元素的集合,在程序中经常有他的身影。由此可见它十分的重要。
目录
数据结构大概分为几个部分,分别是顺序表,链表,栈,树,算法等等。按逻辑关系来分,可分为四种
没有关系:处同一集合
一对一关系:线性表,栈,队列
一对多关系:二叉树
多对多关系:图状结构
按存储关系可以分为
顺序存储:数据紧挨在保存同块空间之中
链式存储:数据随机存储在内存之中,通过指针将其链接。
线性表
按顺序存储的方式来存储的称为顺序表
顺序表一般会采用数组的方式进行存储,为了能够更好的遍历,需要添加一个变量来判断此时数组的长度。正是因为多了一个变量,此时的数组就不在适合用单纯的数组来表示,用结构体显得更加的合适。这就是顺序表的初始化。
//可以采用宏定义来确定数组的长度
#define N 10
typedefine int typedata;
struct stu{
typedata arr[N];
int len;
};
有了一个初始化的顺序表,接下来就是对顺序表进行实例化。
实例化主要是为其开辟一块空间,这里我们用malloc开辟一块空间
struct stu *Order_Lisr_init(void)
{
//开辟一块新空间用于存储
sturct stu *p = (struc *stu)malloc(sizeof(struct stu));
//判断空间是否开辟成功
if(p == NULL)
{
//空间开辟错误直接打印出错信息,结束整个程序;
perror("malloc error");
retrun NULL;
}
p->len = 0;
return p;
}
接下来就是对其进行操作
顺序表的操作总结起来就是四个字:增删改查
增加:
如图所示,如果我们要增加一个15到顺序表中,15可以有多个位置进行添加即0,1,2,3,4。这五个位置。
假设将其插在2这个位置中,为了保证后面的数据不会丢失,所以此时需要先将这个数据后移,即将
第一步移动
len-1————》》len的位置移动。
此处省略n步
最后一步移动:也就是我们要插入的位置loc向后移动一步,即
loc——————》》loc+1
这时,基本思路就出来了,移动之后,总的长度需要加1,即
len+1
下面是代码实现部分
void Order_List_add(struct stu *p,int loc,typedata data)
{
int i;
//判断位置是否合法
if(loc < 0 || loc>p->len)
rentun;
//判断是否顺序表是否已经存满
if(p->len == N)
printf("数据已满");
return;
//通过for循环来移动数据
for(i =p->len; i >= loc+1 i--)
p->arr[i+1] = p->arr[i];
//存储数据
p->arr[loc] = data;
//长度加一
p->len++;
}
为了更好的测试这个功能,所以这时候需要一个遍历操作,代码如下。
void display(struct stu *p)
{
printf("遍历结果为")
int i;
for(i = 0; i < p->len; i++ )
printf("%d ",p->arr[i]);
printf("\n");
}
增的代码就已经全部写完.
删
第一步移动,因为删除代码之后,整个顺序表要往前移动
i+1————》i的位置移动。
此处省略n步
最后一步移动:
len-1——————》》len-2
这时,基本思路就出来了.代码如下
void Order_List_del(struct stu *p,typedata data )
{
int i,j;
whlie(i < p-len)
{
if(p->arr[i] == data)
{
for(j = i+1; j<p->len ;j++)
p->arr[j-1]=p->arr[j];
p->len--;
countinue;
}
i++;
}
}
改
即更新数据,这个思路和删除的思路有点相同,首先我们需要找到我们需要更新的数据,在输入我们想更新的数据即可
代码如下
void Order_list_updata(struct stu *p, typedata old,typedata new)
{
while(i < p->len)
{
if(p->arr[i] == old)
p->arr[i] = new;
}
}
这就是整个顺序表的结构,下面一起来做个小题目测试一下吧。
#include "Order.h"
int main(void)
{
int ret,i;
datatype data;
struct stu*p = Order_init();
if(p == NULL)
return -1;
printf("p:%p\n",p);
// 测试
printf("开始\n");
while(1)
{
ret = scanf("%d",&data);
if(ret != 1)
break;
if(data>0)
{
for(i = 0; i< p->len;i++)
if(data<p->arr[i])
break;
Order_add(p,i,data);
}else if(data<0)
{
Order_del(p,-data);
}
display(p);
}
}
结果
如下哈