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

线性表的顺序表示和实现

前期准备

成都网站制作、成都网站设计、外贸营销网站建设介绍好的网站是理念、设计和技术的结合。成都创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。

所需要的头文件:
#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;
  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;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,则返回零;若str1str2,则返回正数。

  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;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页题目:【数据结构】线性表的顺序表示和实现(C语言)-创新互联
URL分享:http://scyanting.com/article/gcohc.html