线性表的顺序表示和实现
线性结构的特点
1.存在唯一的一个被称做“第一个”的数据元素。
2.存在唯一的一个被称做“最后一个”的数据元素。
3.除第一个之外,集合中每一个数据元素只有一个前驱。
4.除最后一个之外,集合中的每个数据元素只有一个后继。
线性表顺序表示功能实现代码
实现功能分别为:尾插数据,头插数据,显示数据,尾删,头插,按位置插入,查找数据,删除数据,清除数据表,销毁数据表
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define SEQLIST_INIT_SIZE 5 //线性表存储空间的初始分配量
typedef int ElemType;
typedef struct{
ElemType *base; //指向ElemType类型数组指针
int listSize; //数组最大容量
int length; //数组长度
}SeqList;
/*创建顺序表*/
void InitSeqList(SeqList *list){
list->base = (ElemType *)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
assert(list->base !=NULL);
list->listSize = SEQLIST_INIT_SIZE;
list->length = 0;
}
/*尾插法将数据插入*/
void push_back(SeqList *list,ElemType x){
if(list->listSize==list->length){
printf("顺序表已满,不能尾插!\n");
return;
}
list->base[list->length] = x;
list->length++;
}
/*头插法将数据插入*/
void push_front(SeqList *list,ElemType x){
if(list->listSize==list->length){
printf("顺序表已满,不能头插!\n");
return;
}
for(int i=list->length;i>0;i--){
list->base[i] = list->base[i-1];
}
list->base[0] = x;
list->length++;/*每次头插后都向后移动一个位置,
保证0位置可以插入数据*/
}
/*显示顺序表数据*/
void show_list(SeqList *list){
for(int i=0;i<list->length;i++)
printf("%d ",list->base[i]);
printf("\n");
}
/*尾删*/
void pop_back(SeqList *list){
if(list->length==0)
printf("顺序表为空,不能尾删!");
list->length--;
}
/*头删*/
void pop_front(SeqList *list){
if(list->length==0)
printf("顺序表为空,不能头删!");
for(int i=0;i<list->length-1;i++){
list->base[i]=list->base[i+1];
}
list->length--;
}
/*按位置插入*/
void insert_pos(SeqList *list,int pos,ElemType x){
if(pos<0||pos>list->length)
printf("插入位置非法!\n");
return;
for(int i=list->length;i>pos;i--){
list->base[i]=list->base[i-1];
}
list->base[pos]=x;
list->length++;
}
/*查找数据*/
int find(SeqList *list,ElemType key){
for(int i=0;i<list->length;i++){
if(list->base[i]==key)
return i;
}
return -1;
}
/*按数据删除*/
void delete_value(SeqList *list,ElemType key){
int pos = find(list,key);
if(pos == -1){
printf("要删除的数据不存在.\n");
return;
}
for(int i=pos;i<list->length-1;i++){
list->base[i] = list->base[i+1];
}
list->length--;
}
/*清除数据表*/
void clear(SeqList *list){
list->length = 0;
}
/*销毁数据表*/
void destroy(SeqList *list){
free(list->base);
list->base = NULL;
list->length = 0;
list->listSize = 0;
}