顺序表结构
- 逻辑结构:线性表
- 存储结构:顺序存储
- 基本运算:
- 初始化
- 查找节点
- 插入节点
- 删除节点
数据准备
typedef int Status;
typedef struct
{
char name[20]; // 姓名
char stuId[8]; // 学号
}student;
typedef student ElemType;
typedef struct
{
ElemType *elem; // 存储空间的基地址
int length; // 当前长度
}SqList;
初始化
分配内存,此时长度设为0。
Status InitList(SqList *L) // 初始化
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
if(!L->elem) exit(-1);
L->length=0;
printf("初始化成功\n\n");
return 1;
}
查找
int FindByStuId(SqList &L) // 根据学号查找,返回该同学在顺序表中的编号
{
printf("请输入要查找的学生学号:");
char s[20];
scanf("%s",s);
for(int i=1;i<=L.length;i++)
{
if(strcmp(L.elem[i].stuId,s)==0)
return i;
}
return 0;
}
插入
Status ListInsert(SqList &L,int i,ElemType data) // 在 i位置插入
{
if((i<1)||(i>L.length+1)) //序号不正确
return 0;
if(L.length>=MAXSIZE) //已经达到最大值
return 0;
for(int j=L.length;j>=i;j--)
{
L.elem[j+1]=L.elem[j]; //元素后移
}
L.elem[i]=data;
L.length++;
return 1;
}
删除
Status ListDelete(SqList &L,int i) // 删除 i位置的学生信息
{
if((i<1)||(i>L.length)) //序号不正确
return 0;
for(int j=i;j<=L.length;j++)
{
L.elem[j]=L.elem[j+1]; //元素前移
}
L.length--;
return 1;
}
总的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 10
int num;
typedef int Status;
typedef struct
{
char name[20]; // 姓名
char stuId[8]; // 学号
}student;
typedef student ElemType;
typedef struct
{
ElemType *elem; // 存储空间的基地址
int length; // 当前长度
}SqList;
Status InitList(SqList *L) // 初始化
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
if(!L->elem) exit(-1);
L->length=0;
printf("初始化成功\n\n");
return 1;
}
void GetElem(SqList &L,int i) // 访问顺序表
{
printf("学号:%-10s\t姓名:%-20s\n",L.elem[i].stuId,L.elem[i].name);
}
void Input(ElemType *e)
{
printf("姓名:");
scanf("%s",e->name);
printf("学号:");
scanf("%s",e->stuId);
printf("输入完成\n\n");
}
void Input(SqList &L)
{
printf("请输入要录入学生的人数:");
scanf("%d",&num);
for(int i=1;i<=num;i++)
{
printf("第%d个学生:\n",i);
Input(&L.elem[i]);
}
L.length=num;
}
void Output(SqList &L)
{
for(int i=1;i<=num;i++)
{
GetElem(L,i);
}
}
int FindByStuId(SqList &L) // 根据学号查找,返回该同学在顺序表中的编号
{
printf("请输入要查找的学生学号:");
char s[20];
scanf("%s",s);
for(int i=1;i<=L.length;i++)
{
if(strcmp(L.elem[i].stuId,s)==0)
return i;
}
return 0;
}
ElemType FindByNum(SqList &L) // 根据序号查找,返回该同学的信息
{
printf("请输入要查询的位置:");
int n;
scanf("%d",&n);
GetElem(L,n);
}
Status ListInsert(SqList &L,int i,ElemType data) // 在 i位置插入
{
if((i<1)||(i>L.length+1)) //序号不正确
return 0;
if(L.length>=MAXSIZE) //已经达到最大值
return 0;
for(int j=L.length;j>=i;j--)
{
L.elem[j+1]=L.elem[j]; //元素后移
}
L.elem[i]=data;
L.length++;
return 1;
}
void ListInsert(SqList &L)
{
printf ("请输入要插入的位置:");
int id;
scanf("%d",&id);
printf("请输入学生信息:\n");
ElemType temp;
Input(&temp);
if(ListInsert(L,id,temp))
{
num++;
printf("插入成功\n");
}
else
{
printf("插入失败\n");
}
}
Status ListDelete(SqList &L,int i) // 删除 i位置的学生信息
{
if((i<1)||(i>L.length)) //序号不正确
return 0;
for(int j=i;j<=L.length;j++)
{
L.elem[j]=L.elem[j+1]; //元素前移
}
L.length--;
return 1;
}
void ListDelete(SqList &L)
{
printf("请输入要删除的位置:");
int id;
scanf("%d",&id);
if(ListDelete(L,id))
{
num--;
printf("删除成功\n");
}
else
{
printf("删除失败\n");
}
}
void menu()
{
printf("\n********************************\n\n");
printf("1. 录入信息\n");
printf("2. 显示信息\n");
printf("3. 按学号查找学生\n");
printf("4. 按序号查找学生\n");
printf("5. 在指定位置插入学生信息\n");
printf("6. 在指定位置删除学生信息\n");
printf("7. 学生总数\n");
printf("\n********************************\n\n");
}
int main()
{
menu();
SqList L;
ElemType a,b,c,d;
int num,choose;
if(InitList(&L)){
while(1)
{
printf("请输入选择,其他键退出:");
scanf("%d",&choose);
switch(choose)
{
case 1: Input(L); break;
case 2: Output(L); break;
case 3: GetElem(L,FindByStuId(L)); break;
case 4: FindByNum(L); break;
case 5: ListInsert(L); break;
case 6: ListDelete(L); break;
case 7:
printf("已录入的学生个数为:%d\n\n",L.length);
break;
default:
exit(1);
}
}
}
else
{
printf("初始化失败!");
}
return 0;
}
运行结果:
注意:此程序没有太在意数据校验,乱输入可能有bug。