InitList操作的实现
此处实现的是c语言的初始化,与顺序表的写入与展示。所需要关注的部分主要是因为c语言没有c++的引用参数,所以我们需要利用指针实现操作可能回有一丝丝的繁琐。
还有一点需要注意:此处易形成野指针,在main中SqList L.切勿写成Sqlist *L。
我们在此处需要用的是Sqlist L,传地址时用的是&L进行地址传递。
//调入头文件
#include <stdio.h>
#include <stdlib.h>
#define MAXLENGTH 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *data;
int length;
//此处不做动态分配。每个线性表长度是固定的。
}SqList;
Status InitList(SqList *L){
L->data = (ElemType*)malloc(MAXLENGTH*sizeof(ElemType));
if(!L->data) return OVERFLOW;
L->length = 0;
return OK;
}
/*
Status WriteList(SqList *L){
printf("输入顺序表表长:");
scanf("%d",&L->length);
printf("输入%d个元素",L->length);
for(int i=0;i<L->length;i++)
{
scanf("%d",&L->data[i]);
}
}
Status PrintList(SqList *L)
{
if (!L->data){
return ERROR;
}
printf("顺序表元素为:");
for(int i = 0; i < L->length;i++)
{
printf("%d ",L->data[i]);
}
printf("\n");
}
*/
int main(){
SqList L;
InitList(&L);
/*
WriteList(&L);
PrintList(&L);
*/
return 0;
}
其实真正的顺序表构建只有亮着的部分,剩下的是展示的操作。
DestroyList操作的实现
Status DestroyList(SqList *L)
{
L->length = 0;
free(L->data);
printf("已经销毁");
return OK;
}
销毁表的操作函数可以写在main函数前面。
销毁即清除顺序表L的data项空间(我们将数据空间分给的真正目标是data从而间接分给L)。
并且将L->length清除为0;
ClearList
Status ClearList(SqList *L)
{
L->length = 0;
printf("已经清除");
return OK;
}
GetLength
Status GetLength(SqList L){
return L.length;
}
Isempty
Status Isempty(SqList L){
if(L.length == 0) return 1;
else return 0;
}
GetElem
ElemType GetElem(SqList L,int i,ElemType *e)
{
if(i<1||i>L.length) return OVERFLOW;
*e =L.data[i-1];
return OK;
}
LocateElem
int LocateElem(SqList L,ElemType e){
for(int i=0;i<L.length;i++){
if(L.data[i] == e) return i+1;
}
return 0;
}
ListInsert
Status ListInsert(SqList *L,int i,ElemType e)
{
if(i<1||i>L->length+1) return ERROR;
if(L->length ==MAXLENGTH) return ERROR;
for(int j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1]=e;
L->length++;
return OK;
}
插入操作:主要还是for循环里的数值该如何选择设置,我们可以知道物理位置的位置是从length-1到i-1为止,即我们初始的j可以等于length-1,截至条件是到i-1位置的程序也运行过一遍为止(小技巧:记住i--或者i++时,截至条件有等号,循环体便会运行到等号处次数为止。故我们选择length-1与i-1为停止条件。
ListDelete
Status ListDelete(SqList *L,int i){
if(i<1||(i>=L->length)) return ERROR;
for (int j=i;j<=L->length-1;j++)
{
L->data[j-1]=L->data[j];
}
L->length--;
return OK;
}
我们所做的删除操作其实是逆向的增添。
其最关键的也是从哪开始到哪结束,物理地址上,应该是从删除的元素i-1处开始,在length-1处结束。同理我们写下即可。
整体代码:
//调入头文件
#include <stdio.h>
#include <stdlib.h>
#define MAXLENGTH 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *data;
int length;
//此处不做动态分配。每个线性表长度是固定的。
}SqList;
Status InitList(SqList *L){
L->data = (ElemType*)malloc(MAXLENGTH*sizeof(ElemType));
if(!L->data) exit(OVERFLOW);
L->length = 0;
return OK;
}
Status WriteList(SqList *L){
printf("输入顺序表表长:");
scanf("%d",&L->length);
printf("输入%d个元素",L->length);
for(int i=0;i<L->length;i++)
{
scanf("%d",&L->data[i]);
}
}
Status PrintList(SqList *L)
{
if (!L->data){
return ERROR;
}
printf("顺序表元素为:");
for(int i = 0; i < L->length;i++)
{
printf("%d ",L->data[i]);
}
printf("\n");
}
Status DestroyList(SqList *L)
{
L->length = 0;
free(L->data);
printf("已经销毁");
return OK;
}
Status ClearList(SqList *L)
{
L->length = 0;
printf("已经清除");
return OK;
}
Status GetLength(SqList L){
return L.length;
}
Status Isempty(SqList L){
if(L.length == 0) return 1;
else return 0;
}
ElemType GetElem(SqList L,int i,ElemType *e)
{
if(i<1||i>L.length) return OVERFLOW;
*e =L.data[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e){
for(int i=0;i<L.length;i++){
if(L.data[i] == e) return i+1;
}
return 0;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
if(i<1||i>L->length+1) return ERROR;
if(L->length ==MAXLENGTH) return ERROR;
for(int j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1]=e;
L->length++;
return OK;
}
Status ListDelete(SqList *L,int i){
if(i<1||(i>=L->length)) return ERROR;
for (int j=i;j<=L->length-1;j++)
{
L->data[j-1]=L->data[j];
}
L->length--;
return OK;
}
int main(){
SqList L;
ElemType e;
int i;
InitList(&L);
WriteList(&L);
PrintList(&L);
printf("长度:%d",GetLength(L));
printf("空:%d\n",Isempty(L));
printf("需要增加的位置:");
scanf("%d",&i);
printf("需要增加的元素:");
scanf("%d",&e);
ListInsert(&L,i,e);
printf("长度:%d",GetLength(L));
PrintList(&L);
printf("需要减少的元素序号:");
scanf("%d",&e);
ListDelete(&L,e);
PrintList(&L);
printf("长度:%d",GetLength(L));
/*
getchar();
printf("请输入需要查询的元素序号");
scanf("%d",&i);
GetElem(L,i,&e);
printf("所对应的元素为:%d",e);
printf("请输入需要查询的元素");
scanf("%d",&e);
printf("所对应的元素序号为:%d\n",LocateElem(L,e));
*/
ClearList(&L);
DestroyList(&L);
printf("空:%d",Isempty(L));
return 0;
}