数据结构--线性表(顺序表)

xiaoxiao2021-02-28  27

// // main.c // SLDemo // // Created by 娄坤 on 2018/4/9. // Copyright © 2018年 娄坤. All rights reserved. // /* 实验要求: 1:建立一个顺序表 完成 2:顺序表的长度并输出顺序表 完成 3:插入元素的位置和元素 4:删除值为x的元素 5:顺序表倒置 6:将顺序表按升序排序 7:将两个有序表A和B合并为一个有序表C */ #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct //定义一个结构体存储学生信息 { char name[20]; char sex[10]; int age; char id[20]; char addr[30]; } ElemStu; typedef struct //定义一个结构体存储学生结构体 ,即使用链表模式 { ElemStu *elem; //定义一个线性表 int length;//定义线性表的长度 } Seqlist; //创建线性表,向线性表中添加数据 void creat_Seqlist(Seqlist *thelist,int n)//采用结构体指针作为形参接收函数传过来的地址 { int i; thelist->elem = (ElemStu*)malloc(n*sizeof(ElemStu));//动态为线性表分配内存空间 for (i = 0; i < n; i++) { printf("请输入第%d个学生姓名:\n",i+1); gets(thelist->elem[i].name); printf("请输入第%d个学生性别:\n",i+1); gets(thelist->elem[i].sex); printf("请输入第%d个学生年龄:\n",i+1); scanf("%d",&(thelist->elem[i].age)); getchar();//将回车键吃掉 printf("请输入第%d个学生学号:\n",i+1); gets(thelist->elem[i].id); printf("请输入第%d个学生住址:\n",i+1); gets(thelist->elem[i].addr); } thelist->length = n;//为线性表的长度赋值 } //打印线性表中的内容 void print_Seqlist(Seqlist *thelist) { int i; printf("顺序表的长度为:%d\n",thelist->length);//打印输出顺序表的长度 printf("姓名\t性别\t年龄\t学号\t住址\n"); for(i = 0; i < thelist->length; i++)//打印顺序表中的元素 { printf("%s\t%s\t%d\t%s\t%s\n",thelist->elem[i].name,thelist->elem[i].sex,thelist->elem[i].age,thelist->elem[i].id,thelist->elem[i].addr); } } //插入元素 void InsertElem(Seqlist *thelist){ int i,h; int k,p; char name2[20],sex2[10],id2[10],addr2[20]; int age2; printf("请选择要插入元素的位置:\n"); scanf("%d",&h); getchar(); printf("请输入要插入的学生信息:\n"); printf("请输入学生姓名:\n"); gets(name2); printf("请输入学生性别:\n"); gets(sex2); printf("请输入学生年龄:\n"); scanf("%d",&age2); getchar();//将回车键吃掉 printf("请输入学生学号:\n"); gets(id2); printf("请输入学生住址:\n"); gets(addr2); i = thelist->length-h+1;k=thelist->length;p=thelist->length-1; while(i--){ thelist->elem[k] = thelist->elem[p]; k--;p--; } strcpy(thelist->elem[h-1].name, name2);//将姓名插入进去 strcpy(thelist->elem[h-1].sex, sex2);//将性别插入进去 thelist->elem[h-1].age = age2;//将年龄插入进去 strcpy(thelist->elem[h-1].id, id2);//将学号插入进去 strcpy(thelist->elem[h-1].addr, addr2);//将住址插入进去 thelist->length++;//顺序表长度加一 printf("插入后的顺序表为:\n"); printf("姓名\t性别\t年龄\t学号\t住址\n"); for(i = 0; i < thelist->length; i++)//打印顺序表中的元素 { printf("%s\t%s\t%d\t%s\t%s\n",thelist->elem[i].name,thelist->elem[i].sex,thelist->elem[i].age,thelist->elem[i].id,thelist->elem[i].addr); } } //根据姓名和学号查找相关学生的信息 int find_data(Seqlist *thelist){ int i = 0; char name[20];//定义一个数组用来存放要查找的学生的姓名 char id[5];//定义一个数组用来存放要查找的学生的学号 printf("请输入姓名:\n"); scanf("%s",name); printf("请输入学号:\n"); scanf("%s",id); while (i <=thelist->length) { if((strcmp(name,thelist->elem[i].name)==0)&&(strcmp(id,thelist->elem[i].id)==0)){ printf("姓名\t性别\t年龄\t学号\t住址\n"); printf("%s\t%s\t%d\t%s\t%s\n",thelist->elem[i].name,thelist->elem[i].sex,thelist->elem[i].age,thelist->elem[i].id,thelist->elem[i].addr); return i; } i++; } printf("没找到相关学生信息"); return -1; } //删除顺序表中的某个学生的信息 int delData(Seqlist *thelist){ int item = find_data(thelist); if(item != -1){ int i = 0; i = item; for (i = 0; i < thelist->length-1; i++) { thelist->elem[i] = thelist->elem[i+1]; } thelist->length --; } return 0; } //顺序表的倒置 void Invert_Array(Seqlist *thelist){ int i; ElemStu myStu;//创建一个学生的结构体用来做为转置的中间参数 if (thelist->length == 1){ return ; } for(i = 0;i < thelist->length/2;i++){ myStu = thelist->elem[i]; thelist->elem[i] = thelist->elem[thelist->length-i-1]; thelist->elem[thelist->length-i-1] = myStu; } printf("倒置后的顺序表为:\n"); printf("姓名\t性别\t年龄\t学号\t住址\n"); for(i = 0; i < thelist->length; i++)//打印顺序表中的元素 { printf("%s\t%s\t%d\t%s\t%s\n",thelist->elem[i].name,thelist->elem[i].sex,thelist->elem[i].age,thelist->elem[i].id,thelist->elem[i].addr); } } //将顺序表按学号升序排序 void Bubble_Sort_up(Seqlist *thelist){ int i,j,flag=0; ElemStu stu; for(i = 1;i<thelist->length;i++){ flag=1; for(j=0;j<thelist->length-i;j++){ flag=0; if(strcmp(thelist->elem[j].id , thelist->elem[j+1].id) > 0){ stu = thelist->elem[j]; thelist->elem[j] = thelist->elem[j+1]; thelist->elem[j+1] = stu; } } if (flag) {//让排序提前结束 break; } } printf("排序后的结果为:\n"); printf("姓名\t性别\t年龄\t学号\t住址\n"); for(i = 0;i < thelist->length;i++){ printf("%s\t%s\t%d\t%s\t%s\n",thelist->elem[i].name,thelist->elem[i].sex,thelist->elem[i].age,thelist->elem[i].id,thelist->elem[i].addr); } } //将两个有序表A和B合并为一个有序表C(单纯的对数组进行合并,不涉及到结构体) void CombaneArray(){ int n,m,*arrayA,*arrayB,*arrayC;//定义三个指针变量存放数组元素 int i = 0,j=0,k = 0; printf("请输入数组A所含元素的个数:\n"); scanf("%d",&n); arrayA = (int *)malloc(n*sizeof(int));//动态为数组A分配内存大小 printf("随机输入%d个有序个数(从大到小):\n",n); for (i = 0; i < n; i++) { scanf("%d",&arrayA[i]); } printf("请输入数组B所含元素的个数:\n"); scanf("%d",&m); arrayB = (int*)malloc(m*sizeof(int));//动态为数组B分配内存大小 printf("随机输入%d个有序个数(从大到小):\n",n); for (j = 0; j < m; j++) { scanf("%d",&arrayB[j]); } j = 0;i = 0; arrayC = (int *)malloc((m+n)*sizeof(int));//动态为合并后的数组C分配内存 while (i <n&&j<m) { if(arrayA[i]>arrayB[j]){ arrayC[k++] = arrayB[j++]; }else{ arrayC[k++] = arrayA[i++]; } } if(i < n){ while (i<n) { arrayC[k++] = arrayA[i++]; } }else{ while (j<m) { arrayC[k++] = arrayB[j++]; } } for (int i = 0;i < m+n;i++){ printf("%d ",arrayC[i]); } printf("\n"); } //操作菜单 void menu(){ printf("-------顺序表的操作---------\n"); printf(" 1.建立一个顺序表 \n"); printf(" 2.打印顺序表的长度并输出顺序表 \n"); printf(" 3.插入元素的位置和元素 \n"); printf(" 4.按照姓名和学号删除顺序表中的(某个学生信息)元素\n"); printf(" 5.顺序表倒置 \n"); printf(" 6.将顺序表按学号升序排序:\n"); printf(" 7.将两个有序表A和B合并为一个有序表C:\n"); printf(" 8.查看顺序表中的某个元素:\n"); printf(" 0.谢谢使用 \n"); printf("-------顺序表的操作---------\n"); } //主函数 int main() { int n; Seqlist mySeq_class;//初始化结构体 mySeq_class.length = 0;//为结构体长度赋初值为0 int m; while(1){ menu(); printf("请输入操作序号:\n"); scanf("%d",&m); switch (m) { case 1://创建线性表 printf("请输入添加的学生个数\n"); scanf("%d",&n); getchar();//将输入的回车吃掉 creat_Seqlist(&mySeq_class,n);// 调用creat_Sqlist 将mySl_class的地址作为实参传递 break; case 2://打印顺序表 print_Seqlist(&mySeq_class);// 将mySql_class的地址作为实参传递 break; case 3://顺序表的插入操作 InsertElem(&mySeq_class); break; case 4://顺序表的删除操作,删除结构体数组中某位学生的信息 delData(&mySeq_class); break; case 5://顺序表倒置 Invert_Array(&mySeq_class); break; case 6://将顺序表按学号顺序排序 Bubble_Sort_up(&mySeq_class); break; case 7://将两个有序数组A和B合并为一个有序表C CombaneArray(); break; case 8://查找顺序表中的某个学生的信息 find_data(&mySeq_class); break; default: return 0; break; } } return 0; }

顺序表算是线性表中最简单,最基础的数据结构,可能在进行顺序表的操作中,唯一相对来说较为难理解的是有关于&符号的作用,以及指针的使用,指针贯穿整个数据结构的内容,所以必需得熟知。

转载请注明原文地址: https://www.6miu.com/read-2626509.html

最新回复(0)