前期准备
所需要的头文件:
#include
#include
#include
#define MAXSIZE 100
typedef struct {char sid[8]; //8位学号
char name[20]; //姓名
int grade; //成绩
}Student;
typedef struct {Student *elem; //指向数据元素的基地址
int length; //线性表的当前元素个数
}SqList;
- 顺序表的初始化
【算法步骤】
①为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
②将表的当前长度设为0。
【算法描述】
int InitList(SqList &L)
{// L.elem=new Student[MAXSIZE]; //c++
L.elem=(Student *)malloc(sizeof(Student)*MAXSIZE);
L.length=0;
return 1;
}
动态分配线性表的存储区域可以更有效地利用系统的资源,当不需要该线性 表时,可以使销毁操作及时释放占用的存储空间。
- 顺序表的取值
【算法步骤】
取值操作是根据指定的位置序号i,获取顺序表中第1个数据元素的值。
由于顺序存储结构具有随机存取的特点,可以直接通过数组下标定位得到, elem[i-1]单元存储第1个数据元素。
【算法描述】
void prin(SqList *L, int n) {int i;
printf("请分别输入每个学生的信息:\n");
for (i = 0; i< n; i++) {printf("学号:");
scanf("%s", L->elem[i].sid);
printf("姓名:");
scanf("%s", L->elem[i].name);
printf("成绩:");
scanf("%d", &L->elem[i].grade);
printf("----------------------------------\n");
}
L->length=n;
}
- 顺序表的输出
void output(SqList *L, int n) {int i;
printf("------学生表------\n");
printf("学号\t姓名\t成绩\n");
for (i = 0; i< n; i++)
printf("%s\t%s\t%d\n", L->elem[i].sid,L->elem[i].name, L->elem[i].grade);
}
- 顺序表的查找
查找操作是根据指定的元素值e,查找顺序表中第1个值与e相等的元素。若查找成功,则返回该元素在表中的位置序号;若查找失败,则返回0。
算法2.3 顺序表的查找
【算法步骤】
①从第一个元素起,依次将其值和e相比较,若找到值与e相等的元素L.elem[],则查找成功,返回该元素的序号i+1。
②若查遍整个顺序表都没有找到,则查找失败,返回0。
按名字查找
void search(SqList *L,int n)
{printf("请输入要查找的名字\n");
char searchname[20];
scanf("%s",searchname);
for(int i=0;ilength;i++)
{if(strcmp(L->elem[i].name,searchname)==0)
printf("学号为%s\t成绩为%d\n",L->elem[i].sid,L->elem[i].grade);
}
}
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1
- 顺序表的插入
【算法步骤】
①判断插入位置是否合法(值的合法范围是1≤i≤n+1),若不合法则返回ERROR。
②判断顺序表的存储空间是否已满,若满则返回ERROR。
③将第n个至第1个位置的元素依次向后移动一个位置,空出第1个位置(i=n+1时无须移动)。
④将要插入的新元素e放入第个位置。
⑤ 表长加1。
【算法描述】
//添加学生
void addstudent(SqList *L,int n)
{printf("添加学生\n");
char addsid[8];
char addname[20];
int addgrade;
int locte;
printf("请输入插入的学号\n");
scanf("%s",&addsid);
printf("请输入插入的名字\n");
scanf("%s",&addname);
printf("请输入插入的成绩\n");
scanf("%d",&addgrade);
printf("请输入插入的位置\n");
scanf("%d",&locte);
for(int j=L->length-1;j>=locte-1;j--)
L->elem[j+1]=L->elem[j];
strcpy(L->elem[locte-1].sid,addsid);
strcpy(L->elem[locte-1].name,addname);
L->elem[locte-1].grade=addgrade;
L->length+=1;
}
6.顺序表的删除
算法2.5顺序表的删除
【算法步骤】
①判断删除位置i是否合法(合法值为1≤i≤n),若不合法则返回ERROR。
②将第计1个至第n个元素依次向前移动一个位置(i=n时无须移动)。
③表长减1。
【算法描述】
//删除指定位置的学生记录
void delestudent(SqList *L,int n)
{printf("请输入要删除的位置\n");
int deloca;
scanf("%d",&deloca);
for(int j=deloca;j<=L->length-1;j++)
L->elem[j-1]=L->elem[j];
L->length-=1;
}
- 顺序表的长度与销毁
// 统计顺序表中学生个数
void studentnum(SqList *L)
{printf("一共有%d个学生",L->length);
}
//销毁
void distroylist(SqList *L)
{free(L);
}
主函数int main()
{SqList std;
InitList(std);
printf("请输入学生人数:");
scanf("%d", &std.length);
prin(&std, std.length);
output(&std, std.length);
search(&std,std.length);
addstudent(&std, std.length);
output(&std, std.length);
delestudent(&std, std.length);
output(&std, std.length);
studentnum(&std);
distroylist(&std);
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前名称:【数据结构】线性表的顺序表示和实现(C语言)-创新互联
本文网址:http://lswzjz.com/article/gcohc.html