数据结构与算法—复习:线性表(顺序表实现)
代码用作复习记录,不够规范,欢迎批评指正。
/**
* 程序说明:线性表的顺序实现
* 1.创建空线性表
* 2.在list的位置p之前插入一个元素
* 3.在list的位置p之后插入一个元素
* 4.删除一个x值的元素
* 5.在list删除位置为p的元素,并返回成功与否的标志
* 6.在list中查找值为x的元素的位置
* 7.判断线性表是否为空
* 8.线性表初始化
*/
#include <stdio.h>
#include <malloc.h>
/**
* 线性表结构定义
*/
struct SeqList{
int MAXNUM; //表明线性表最大长度
int n; //表明线性表当前存储元素个数
int* vals; // DataType* X;
};
typedef struct SeqList * PSeqList; //定义一个指向SeqList的指针类型
/**
* 1.创建一个空的线性表
* @param m 线性表长度
* @return
*/
PSeqList createNullList_Seq(int m){
PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
if(palist != NULL){
palist->vals = (int*)malloc(sizeof(int) * m);
if(palist->vals){
palist->n = 0;
palist->MAXNUM = m;
return palist;
} else{
free(palist);
}
}
printf("创建线性表时分配空间失败\n");
return NULL;
}
/**
* 2.判断线性表是否为空
* @param palist
* @return
*/
int isNullList_Seq(PSeqList palist){
if(palist->n == 0)
return -1;
else
return 0;
}
/**
* 3.输入数据,找出该数据位于线性表的下标
* @param palist
* @param x
* @return
*/
int locate_seq(PSeqList palist,int x){
if(isNullList_Seq(palist))
return -1;
for(int i=0;i<palist->n;i++)
{
if(palist->vals[i] == x)
return i;
}
return -1;
}
/**
* 4.对指定的下标数据前,插入数据
* @param palist
* @param position
* @param x
* @return
*/
int insertPre_seq(PSeqList palist, int position,int x){
if(isNullList_Seq(palist))
return -1;
if(palist->MAXNUM <= position){
printf("插入时,下标超过最大值\n");
return -1;
}
if(position<0 || position>palist->n){
printf("不存在下表为%d的元素\n",position);
}
for(int i = palist->n; i>=position; i--)
{
palist->vals[i] = palist->vals[i-1];
}
palist->vals[position] = x;
palist->n += 1;
printf("插入成功\n");
return 1;
}
/**
* 5.删除指定下标的元素
* @param palist
* @param position
* @return
*/
int deleteP_seq(PSeqList palist,int position){
if(isNullList_Seq(palist)){
printf("线性表为空,无法删除\n");
return -1;
}
if(position > palist->n || position < 0){
printf("当前线性表不存在下表为%d的数据,无法删除\n",position);
return -1;
}
for(int i = position + 1; i<palist->n;i++){
palist->vals[i-1] = palist->vals[i];
}
palist->n -= 1;
printf("删除成功\n");
return 1;
}
/**
* 6.查找元素的删除方法
* @param palist
* @param x
* @return
*/
int deleteV_seq(PSeqList palist,int x){
if(isNullList_Seq(palist)){
printf("线性表为空,无法删除\n");
return -1;
}
if(locate_seq(palist,x) == -1){
printf("元素不存在,无法删除\n");
return -1;
}
deleteP_seq(palist,locate_seq(palist,x));
printf("删除成功\n");
return 1;
}
/**
* 7.初始化数据的方法
* @param palist
* @param data
*/
void initData(PSeqList palist,int data[]){
for(int i=0;i<6;i++)
{
palist->vals[i] = data[i];
(palist->n)++;
}
}
/**
* 8.线性表打印方法
* @param palist
*/
void printSeqList(PSeqList palist){
if(isNullList_Seq(palist)){
printf("线性表为空,无法打印\n");
return;
}
for(int i=0;i<palist->n;i++){
printf("%d,",palist->vals[i]);
}
printf("\n");
}
/**
* 程序测试入口
* @return
*/
int main(){
int data[] = {1,2,3,4,5,6};
PSeqList palist = createNullList_Seq(100);
printf("正在初始化数据...\n");
initData(palist,data);
printf("初始化成功,打印线性表\n");
printSeqList(palist);
printf("测试:判断线性表是否为空:%d\n",isNullList_Seq(palist));
printf("寻找数据:4,返回下标%d\n",locate_seq(palist,4));
printf("插入数据:666,在下标:2之前;是否成功:%d;打印线性表:\n",insertPre_seq(palist,2,666););
printSeqList(palist);
printf("测试:删除下标为3的数据,是否成功:%d\n",deleteP_seq(palist,3));
printSeqList(palist);
printf("测试:删除数据:5,是否成功:%d\n",deleteV_seq(palist,5));
printSeqList(palist);
printf("测试结束\n");
}