按照顺序存储:
顺序表
按照链式存储:
链表 (单向链表 双向链表 内核链表 )
数据只有一个前驱和一个后继,数据紧挨保存。
具体实现:
数组:int arr[100];
弊端:100个元素,我只初始化了50个,但是遍历的时候,100个元素全部都会被遍历出来。
改进:(使用结构体)
struct seq{
int arr[100]; // 数据保存的地方
int len; // 有效数据个数
};
这样的话,就可以只遍历我们使用到的部分。
顺序表的优点缺点:
缺点:添加数据 删除数据 非常麻烦
优点:查询,替换数据非常方便(下标)
#include
#include
#define N 7
typedef int datatype;
struct seqlist{ //先定义一个结构体
datatype data[N]; //定义一个长度为7的数组
int len; //数组中,有效数据的个数
};
/***************************************
*函数名称:seq_init
*函数功能:对顺序表进行初始化 *** 作
*函数参数:void
*返 回 值:
struct seq *: 所开辟的堆的首地址
****************************************
*/
struct seq *seq_init(void)
{
struct seq *p = (struct seq *)malloc(sizeof(struct seq));//在堆中开辟空间
if(p == NULL) // malloc 出错处理
{
perror("seq_init malloc error");
return NULL;
}
p->len = 0; //由于一开始没有数据插入数组,所以此时数组中存储的有效数据的个数为0
return p;
}
/***************************************
*函数名称:seq_add
*函数功能:往顺序表中添加数据
*函数参数:
d : 被添加的数据
p : 顺序表
loc: 数据存放的位置(不是下标,loc ==1的时候,指的是数组中第一个元素的位置)
*返 回 值:void
****************************************
*/
void seq_add(struct seq *p,datatype d,unsigned int loc)
{
//判断顺序表是否存满
if(p->len == N){
printf("sorry!满了\n");
return; //结束函数
}
/* 判断位置是否合法,数组中存储的数据必须是一个紧挨着一个,即:后面的数据必须紧挨着前面的数据,中间不允许隔有空位置,所以插入的位置最多也就是数组的尾部,也就是数组的最后一个元素data[p->len-1]的后面,即:data[p->len]这个位置,所以,loc不能大于p->len+1(注意:loc不是数组的下标,loc是从1开始的,而不是从0开始。所以,数组中第一个元素data[0]的位置为:loc == 1,而不是loc == 0。同理,最后一个元素data[p->len-1]的位置为:loc == p->len,而不是loc == p->len-1。*/
if(loc<1 || loc > p->len+1)
{
printf("您的位置不合法\n");
return; //结束函数
}
/* 存储数据 */
int i;
for(i=p->len;i>=loc;i--){ //从位置loc( 即:data[loc-1] ) 开始往后,将数据依次往后面挪动一个位置,留出一个空位,好让新数据插入空位中
p->data[i]=p->data[i-1];
}
p->data[loc-1]=d; //将数据插入刚才留出来的空位中
p->len++; //新数据插入后,数组长度+1,所以,我们需要在这里手动更新一下数组中存储的有效数据的个数+1
}
/***************************************
*函数名称:seq_del
*函数功能:从顺序表中删除数据
*函数参数:
p : 顺序表
loc: 数据删除的位置(不是下标)
*返 回 值:int : 成功返回0 失败返回-1
****************************************
*/
int seq_del(struct seq *p,unsigned int loc,datatype *d)
{
//判断位置是否合法,或者为空
if(loc<1 || loc > p->len)
{
printf("您的位置不合法\n");
return -1; //结束函数
}
// 删除数据
*d = p->data[loc-1]; //将需要删除的数据传出去
int i;
for(i=loc;i<=p->len-1;i++){
p->data[i-1]=p->data[i];
}
p->len--; // 整个有效数据长度-1
return 0;
}
/***************************************
*函数名称:seq_update
*函数功能:修改顺序表中数据
*函数参数:
p : 顺序表
old: 旧数据(需要修改的数据)
new:新数据(修改后的数据)
*返 回 值:int : 成功返回0 失败返回-1
****************************************
*/
void seq_update(struct seq *p,datatype old,datatype new)
{
int i;
for(i=0;i
if(old == p->data[i])
p->data[i]=new;
}
}
/***************************************
*函数名称:display
*函数功能:遍历打印顺序表中的数据
*函数参数:
p : 顺序表
*返 回 值:void
****************************************
*/
void display(struct seq *p)
{
printf("遍历结果为:");
int i;
for(i=0;i
printf("%d ",p->data[i]);
}
printf("\n");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)