Update 2.数组存储的线性表.c

fix bug
This commit is contained in:
callmePicacho
2022-08-23 22:01:51 +08:00
committed by GitHub
parent 2bfc03a124
commit 9ad70a594b

View File

@@ -1,24 +1,24 @@
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100 // MAXSIZE <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ Data <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
typedef int ElementType; // ElementType <EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAXSIZE 100 // MAXSIZE 定义为 Data 数组的大小
typedef int ElementType; // ElementType 可定义为任意类型
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last; // Last <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
int Last; // Last 定义线性表的最后一个元素
};
List L;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ i <20><>Ԫ<EFBFBD>أ<EFBFBD>L->Data[i]
//<EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>ȣ<EFBFBD>L->Last+1
//访问下标为 i 的元素:L->Data[i]
//线性表的长度:L->Last+1
List MakeEmpty(); //<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int Find(ElementType X,List L); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> X <20><>һ<EFBFBD>γ<EFBFBD><CEB3>ֵ<EFBFBD><D6B5>±<EFBFBD>
void Insert(ElementType X,int i,List L); //<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ i <20>ĵط<C4B5><D8B7><EFBFBD><EFBFBD><EFBFBD> X
void Delete(int i,List L); //ɾ<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ i <20>ĵ<EFBFBD>ǰֵ
ElementType FindKth(int K,List L); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ K <20>ĵ<EFBFBD>ǰֵ
int Length(List L); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
List MakeEmpty(); //初始化顺序表
int Find(ElementType X,List L); //查找 X 第一次出现的下标
void Insert(ElementType X,int i,List L); //在下标为 i 的地方插入 X
void Delete(int i,List L); //删除下标为 i 的当前值
ElementType FindKth(int K,List L); //返回下标为 K 的当前值
int Length(List L); //返回顺序表的长度
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
//初始化
List MakeEmpty(){
List L;
L = (List)malloc(sizeof(struct LNode));
@@ -26,58 +26,58 @@ List MakeEmpty(){
return L;
}
// <EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 按值查找
int Find(ElementType X,List L){
int i=0;
while(i <= L->Last && L->Data[i] != X)
i++;
if(L->Last < i) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1
if(L->Last < i) //如果没找到,返回 -1
return -1;
else // <EFBFBD>ҵ<EFBFBD><EFBFBD>󷵻<EFBFBD><EFBFBD>±<EFBFBD>
else // 找到后返回下标
return i;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 插入
void Insert(ElementType X,int i,List L){
int j;
if(L->Last == MAXSIZE-1){ //λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
if(L->Last == MAXSIZE-1){ //位置已满
printf("表满");
return;
}
if(i < 0 || L->Last+1 < i){ //λ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L->Data[L->Last+1]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("λ<EFBFBD>ò<EFBFBD><EFBFBD>Ϸ<EFBFBD>");
if(i < 0 || L->Last+1 < i){ //位置越界,如果将数插入 L->Data[L->Last+1],下面都不用腾位置了
printf("位置不合法");
return;
}
for(j=L->Last;j>=i;j--) // <EFBFBD>Ӻ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ųһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a[i]<5D>ڳ<EFBFBD>λ<EFBFBD><CEBB>
for(j=L->Last;j>=i;j--) // 从后往前依次向后挪一个,给 a[i]腾出位置
L->Data[j+1] = L->Data[j];
L->Data[i] = X; //<EFBFBD><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>
L->Last++; // Last<EFBFBD><EFBFBD>Ȼָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
L->Data[i] = X; //新元素插入
L->Last++; // Last仍然指向最后元素
return;
}
//ɾ<EFBFBD><EFBFBD>
//删除
void Delete(int i,List L){
int j;
if(i < 0 || L->Last <i){ //λ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L->Data[L->Last]
printf("L->Data[%d]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>",i);
if(i < 0 || L->Last <i){ //位置越界,而删除最多到 L->Data[L->Last]
printf("L->Data[%d]不存在元素",i);
return;
}
for(j=i;j<=L->Last;j++) // <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰŲһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a[i] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(j=i+1;j<=L->Last;j++) // 从前往后依次向前挪一个,将 a[i] 覆盖了
L->Data[j-1] = L->Data[j];
L->Last--; // Last<EFBFBD><EFBFBD>Ȼָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
L->Last--; // Last仍然指向最后元素
return;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 按序查找
ElementType FindKth(int K,List L){
if(K < 0 || L->Last < K){ //λ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD>
printf("L->Data[%d]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>",K);
if(K < 0 || L->Last < K){ //位置越界
printf("L->Data[%d]不存在元素",K);
return;
}
return L->Data[K];
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//表长
int Length(List L){
return L->Last+1;
}
@@ -86,24 +86,24 @@ int main(){
int i=0;
L = MakeEmpty();
Insert(11,0,L);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>L-Data[0]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>11\n");
printf("在线性表L-Data[0]插入11\n");
Insert(25,0,L);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>L-Data[0]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>25\n");
printf("在线性表L-Data[0]插入25\n");
Insert(33,0,L);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>L-Data[0]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>33\n");
printf("在线性表L-Data[0]插入33\n");
Insert(77,0,L);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>L-Data[0]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>77\n");
printf("<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>Ϊ<EFBFBD><EFBFBD>");
printf("在线性表L-Data[0]插入77\n");
printf("此时的线性表为:");
for(i=0;i<Length(L);i++)
printf("%d ",L->Data[i]);
printf("\n");
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ12<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>ǣ<EFBFBD>%d\n",Find(12,L));
printf("<EFBFBD>±<EFBFBD>Ϊ3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǣ<EFBFBD>%d\n",FindKth(3,L));
printf("查找值为12的下标是%d\n",Find(12,L));
printf("下标为3的线性表的值是%d\n",FindKth(3,L));
Delete(2,L);
printf("ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ2<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>\n");
printf("删除线性表中下标为2的元素\n");
Delete(2,L);
printf("ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>Ϊ2<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>\n");
printf("<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>Ϊ<EFBFBD><EFBFBD>");
printf("删除线性表中下标为2的元素\n");
printf("此时的线性表为:");
for(i=0;i<Length(L);i++)
printf("%d ",L->Data[i]);
printf("\n");