【数据结构】线性表的顺序表示和实现(C语言)

线性表的顺序表示和实现

前期准备

所需要的头文件:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAXSIZE 100

typedef struct {
    char sid[8];   //8位学号
    char name[20]; //姓名
    int grade;     //成绩
}Student;

typedef  struct {
  Student  *elem;     //指向数据元素的基地址
  int  length;       //线性表的当前元素个数
}SqList;
  1. 顺序表的初始化

【算法步骤】
①为顺序表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;
}

动态分配线性表的存储区域可以更有效地利用系统的资源,当不需要该线性 表时,可以使销毁操作及时释放占用的存储空间。

  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;
}
  1. 顺序表的输出
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);
}
  1. 顺序表的查找

查找操作是根据指定的元素值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;i<L->length;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<str2,则返回负数;若str1>str2,则返回正数。

  1. 顺序表的插入
    【算法步骤】
    ①判断插入位置是否合法(值的合法范围是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;
}
  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;
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值