您的位置:首页 > 其它

线性表的顺序储存及基本操作

2017-03-31 21:21 337 查看
#include<stdio.h>
#include<stdlib.h>
#define INIT_SIZE 10    // 线性表初始容量
#define INCREMENT_SIZE 5 // 当线性表容量不够时,增加元素之前,线性表增长量
#define OVERFLOW -5 // 内存分配失败后的退出代号

typedef struct {
int *data;  // 线性顺序表的基地址(首地址)ַ
int length; // 当前线性表元素个数
int capacity; //当前线性表的容量
} SequenceList;

/*
* 初始化线性表分配内存空间以及相关参数设定
*/
void init_list(SequenceList *slist)
{

slist->data = (int *)malloc(INIT_SIZE*sizeof(int));
if(!slist->data) exit(OVERFLOW); // 如果分配内存失败则退出程序
slist->length = 0;  //初始化当前元素个数为0
slist->capacity = INIT_SIZE; // 初始化当前线性表容量为INIT_SIZE
}

/*
* 插入操作
*/
void Insert(SequenceList *slist, int element, int index)
{

// 插入之前判断线性表的容量是否够大,如果不够,按照INCREMENT_SIZE扩充容量
// 重新申请内存空间
if(index >= slist->capacity)
{
slist->data = (int *)realloc(slist->data,
(slist->capacity + INCREMENT_SIZE)*sizeof(int));
if(!slist->data) exit(OVERFLOW);
slist->capacity += INCREMENT_SIZE;
}

for(int i=slist->length-1; i > index ; i--)
*(slist->data + i + 1) = *(slist->data + i);

*(slist->data + index) = element;
slist->length++;

}

/*
* 索引操作
*/
int getElement(SequenceList *slist, int index)
{
return *(slist->data + index);
}

/*
* 更新操作
*/
void updateElement(SequenceList *slist, int index, int newValue)
{
*(slist->data + index) = newValue;
}

/*
* 删除操作
*/
int deleteElement(SequenceList *slist, int index)
{
int result = *(slist->data + index);
for(int i=index; i < slist->length; i++)
*(slist->data + i) = *(slist->data + i + 1);
slist->length--;
return result;
}

/*
* 合并操作
*/
SequenceList mergeList(SequenceList slist1, SequenceList slist2)
{

SequenceList newList;
init_list(&newList);

int p = 0;
int q = 0;
int r = 0;

while(p<slist1.length && q<slist2.length){
int a = *(slist1.data+p);
int b = *(slist2.data+q);

printf("compare a = %d, b = %d\n", a, b);

if (a <= b){
Insert(&newList, a, r);
p++;
}else {
Insert(&newList, b, r);
q++;
}
r++;

}

while(p < slist1.length) {
Insert(&newList,  *(slist1.data + p), r);
r++;
p++;
}

while(q < slist2.length) {
Insert(&newList, *(slist2.data + q), r);
r++;
q++;
}

return newList;

}

/*
* 打印线性顺序表的所有信息
*/
void print_slist_info(SequenceList slist)
{

printf("sequence list\ncapacity is %d\nlength is %d\n", slist.capacity, slist.length);
for(int i=0; i < slist.length; i++)
printf("%d ", *(slist.data + i));
}

int main()
{
SequenceList sequence_list;
init_list(&sequence_list);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线性表