**1、基本概念(**如何有效的高效的研究数据的存储)
数据结构是一门研究如何有效组织数据,并提高数据处理效率的学科。通过研究各种数据内部的逻辑关系,使用某种特定的存储形式,并在此基础上对数据实施各种操作,这些工作被称为称为广义上的算法。
- 逻辑结构:线性表,集合,树,图等结构
2、顺序表
- 基本概念:顺序存储的线性表;如果有n个元素,其中一个a元素有且只有一个前驱a-1,有且只有一个后去a+1,首元素没有前驱a0-1,尾元素没有后驱an+1;当中的数据是一个挨着一个的,常被称为一对一关系。反之,如果数据之间的关系不是一对一的,就是非线性的。
- 顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,或者是匿名的堆数组。
顺序表的设计:
- 设计一个专门管理顺序表的"管理结构体",管理结构体中一般会包含:
-
顺序表总容量
-
顺序表当前最末元素下标位置
-
顺序表指针
struct seq
{
int cap; // 顺序表容量
int last; // 最末元素下标
int * data; // 顺序表,以整型数据为例
};
2.初始化顺序表:
//初始化顺序数据表
struct seq *init_callloc(int cap)
{
struct seq *p=calloc(1,sizeof(struct seq));
if (p!=NULL)
{
p->cap=cap;
p->last=0;
p->data=calloc(1,sizeof (int)*cap);
if (p->data!=NULL)
return p;
else
free(p);
}
}
3.增删,遍历,查找节点:
//判断是否为空
bool seq_Empty(struct seq *s)
{
return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{
return s->last==s->cap;
}
//查找位置
int seq_find(struct seq *s,int data)
{
if (seq_Empty(s))
{
printf("seq is empty\n");
return -1;
}
for (int i = 0; i < s->last; i++)
{
if (s->data[i]=data)
{
return i;
}
}
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{
if (seq_Full(s))
{
printf("seq is full\n");
return;
}
s->data[s->last]=data;
s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{
if (seq_Full(s))
{
printf("seq is full\n");
return;
}
s->data[0]=data;
s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{
int index;
for (int i = 0; i < s->last; i++)
{
if (s->data[i]>data)
{
index=i;
break;
}
else
{
index=i+1;
continue;
}
}
for (int i = s->last; i >= index ; i--)
{
s->data[i+1] = s->data[i];
}
s->last++;
s->data[index] = data;
}
//遍历顺序表
void seq_show(struct seq *s)
{
if(seq_Empty(s))
{
printf("Sequence is empty!\n");
return;
}
printf("Sequence list data is:");
for (int i = 0; i <= s->last; i++)
{
printf("%d ", s->data[i]);
}
printf("\n");
}
// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{
if(index != -1)
{
// 后面的数据要向前移动
while (1)
{
if(index == s->last)
{
s->data[index]=0;
s->last--;
break;
}
s->data[index] = s->data[index+1];
index++;
}
return true;
}
return false;
}
4.销毁顺序表:
//销毁顺序表
void seq_destroy(struct seq *s)
{
if (s==NULL)
return;
free(s->data);
free(s);
}
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
struct seq
{
int cap;
int last;
int *data;
};
//初始化顺序数据表
struct seq *init_callloc(int cap)
{
struct seq *p=calloc(1,sizeof(struct seq));
if (p!=NULL)
{
p->cap=cap;
p->last=0;
p->data=calloc(1,sizeof (int)*cap);
if (p->data!=NULL)
return p;
else
free(p);
}
}
//判断是否为空
bool seq_Empty(struct seq *s)
{
return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{
return s->last==s->cap;
}
//查找位置
int seq_find(struct seq *s,int data)
{
if (seq_Empty(s))
{
printf("seq is empty\n");
return -1;
}
for (int i = 0; i < s->last; i++)
{
if (s->data[i]=data)
{
return i;
}
}
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{
if (seq_Full(s))
{
printf("seq is full\n");
return;
}
s->data[s->last]=data;
s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{
if (seq_Full(s))
{
printf("seq is full\n");
return;
}
s->data[0]=data;
s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{
int index;
for (int i = 0; i < s->last; i++)
{
if (s->data[i]>data)
{
index=i;
break;
}
else
{
index=i+1;
continue;
}
}
for (int i = s->last; i >= index ; i--)
{
s->data[i+1] = s->data[i];
}
s->last++;
s->data[index] = data;
}
//遍历顺序表
void seq_show(struct seq *s)
{
if(seq_Empty(s))
{
printf("Sequence is empty!\n");
return;
}
printf("Sequence list data is:");
for (int i = 0; i <= s->last; i++)
{
printf("%d ", s->data[i]);
}
printf("\n");
}
//销毁顺序表
void seq_destroy(struct seq *s)
{
if (s==NULL)
return;
free(s->data);
free(s);
}
// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{
if(index != -1)
{
// 后面的数据要向前移动
while (1)
{
if(index == s->last)
{
s->data[index]=0;
s->last--;
break;
}
s->data[index] = s->data[index+1];
index++;
}
return true;
}
return false;
}
int main(int argc,char *argv[])
{
int cap;
printf("请输入需要的内存:");
scanf("%d",&cap);
struct seq *s=init_callloc(cap);
int data;
while(1)
{
printf("请输入[正整数为插入,负数为删减]:");
scanf("%d",&data);
if (data>0)
{
if (seq_Empty(s))
{
seq_tail(s,data);
}
else if(seq_Full(s))
{
printf("seq is full\n");
continue;
}
else
{
seq_middil(s,data);
}
}
else
{
int index = seq_find(s, -data);
remove_sequenceList(s, index);
}
seq_show(s);
}
seq_destroy(s);
return 0;
}