求一个C语言实现顺序表,要有注释的,谢谢🙏
这是我之前学习时,写的,可以看看。有不懂可以问
#include <stdio.h>
#include "stdlib.h"
/*预定义常量和类型*/
/*函数结果状态码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
/*Status 是函数的类型,其值是函数结果状态代码*/
typedef int Status;
typedef char ElemType; //单个元素类型
#define MAXSIZE 100
typedef struct
{
ElemType *elem; // 数组指针elem指示顺序表的基地址
int length;
}SqList; //结构体类型名 : SqList
/*1、构造一个空的顺序表L*/
Status InitList_Sq(SqList *L) //结构体指针变量作为形参
{
//L.elem=new ElemType[MAXSIZE]; //为顺序表分配空间
(*L).elem =(ElemType *)malloc(sizeof(ElemType)*MAXSIZE); //(*L).elem = L->elem
if(!L->elem) exit(OVERFLOW); //异常处理,存储分配失败
L->length=0; //空表长度为0
return OK; //OK=1
}
/*2、销毁线性表L */
void DestroyList(SqList *L)
{
if (L->elem)
{
free(L->elem); //释放存储空间
}
}
/*3、清空线性表L*/
void ClearList(SqList *L)
{
L->length=0; //将线性表的长度置为0
}
/*4、求线性表L的长度*/
int GetLength(SqList *L)
{
return (L->length); //
}
/*5、判断线性表L是否为空*/
int IsEmpty(SqList *L)
{
if (L->length==0)
return 1;
else
return 0;
}
/*6、顺序表的取值(根据位置i 获取相应位置数据元素的内容)*/
int GetElem(SqList *L,int i,ElemType *e)
{
if (i<1 || i> L->length)
return ERROR; //判断i值是否合理,若不合理,返回ERROR
*e=L->elem[i-1]; //第i-1 的单元存储着第i个数据
return OK;
}
/*7、顺序表的查找*/
int LocateELem(SqList *L,ElemType e)
{
int i;
//在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
for (i=0; i< L->length;i++)
if (L->elem[i]==e)
return i+1; //查找成功,返回序号
return 0; //查找失败,返回0
}
/*8、顺序表的插入*/
Status ListInsert_Sq(SqList *L,int i ,ElemType e)
{
int j;
if(i<1 || i>L->length+1) return ERROR; //i值不合法
if(L->length==MAXSIZE) return ERROR; //当前存储空间已满
for(j=L->length-1;j>=i-1;j--)
L->elem[j+1]=L->elem[j]; //插入位置及之后的元素后移
L->elem[i-1]=e; //将新元素e放入第i个位置
L->length ++; //表长增1
return OK;
}
/*9、顺序表元素的删除*/
Status ListDelete_Sq(SqList *L,int Del_Loc)
{
int j;
if((Del_Loc < 1)||(Del_Loc > L->length)) return ERROR; //i值不合法
for (j= Del_Loc; j <= L->length-1; j++)
L->elem[j-1] = L->elem[j]; //被删除元素之后的元素前移
--L->length; //表长减1
return OK;
}
void ListInput(SqList *L, int n) //顺序表数据的输入
{
int i = 0;
L->length = n;
//printf("L->length =%d",L->length);
for(i=0;i < n;i++)
{
scanf("%d",&L->elem[i]);
}
}
void PrintSqList(SqList *L) //顺序表的元素输出
{
int i;
for(i=0;i < L->length;i++)
{
printf("%d ",L->elem[i]);
}
putchar('\n');
}
/***************************************************/
int main(int argc, char const *argv[])
{
int length; //顺序表的长度
int i;
SqList L1; // 声明了结构体变量L
if (InitList_Sq(&L1)) // 结构体变量地址作为实参
printf("0 初始化顺序表成功!!!\n");
printf("1 请输入顺序表的长度:");
scanf("%d",&length);
printf("2 请输入数据:");
ListInput(&L1, length); //顺序表数据的输入
printf("3 顺序表L1为:");
PrintSqList(&L1);
/*4、求线性表L的长度*/
printf("4 L1.length = %d\n",GetLength(&L1));
/*5、判断线性表L是否为空*/
printf("5 断线性表L1是否为空 %d\n",IsEmpty(&L1));
/*6、顺序表的取值(根据位置i 获取相应位置数据元素的内容)*/
ElemType a,*e=&a;
GetElem(&L1,2,e);
printf("6 L1的第2个元素是:%d\n",*e);
/*7、顺序表的查找*/
printf("7 3是在L1中的位置:%d\n",LocateELem(&L1,3));
return 0;
}