/*郭睿玥第一次算法實驗作業*/
/*實驗原理
順序表是在計算機內存中以數組的形式保存的線性表,線性表的順序存儲是指
用一組地址連續的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結
構上相鄰的數據元素存儲在相鄰的物理存儲單元中,即通過數據元素物理存儲的相
鄰關系來反映數據元素之間邏輯上的相鄰關系,采用順序存儲結構的線性表通常稱
為順序表。順序表是將表中的結點依次存放在計算機內存中一組地址連續的存儲單
元中。
*/
/*實驗環境
CodeBlocks*/
/*實驗目的
(1) 掌握順序表的概念及實現方式。
(2) 掌握順序表的存儲結構及主要運算:建立、查找、插入、刪除等。*/
/*實驗內容
定義一個包含學生信息(學號,姓名,成績)的順序表,使其具有如下功能:
(1) 逐個輸入學生信息,建立信息表;
(2) 顯示信息表中所有學生的相關信息;
(3) 根據姓名進行查找,返回此學生的學號和成績;
(4) 給定一個學生信息,插入到表中指定的位置;
(5) 刪除指定位置的學生記錄;
(6) 統計表中學生人數;
(7) 根據自己的理解添加更多的內容。*/
/*算法實現如下*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int Status;// 定義函數返回值類型
typedef int ElemType; // 定義每條數據的結構體類型
typedef struct {
char number[20];// 學號
char name[20];// 姓名
int score; // 成績
} Student;
typedef struct {
Student *elem;// 存儲空間的基地址
int length;// 當前長度
} SqList;
SqList L;
void build(SqList * L) // 構造空的順序表 L
{
L->elem = (Student *) (malloc(sizeof(Student) * MAXSIZE)); //申請空間
L->length = 0;//空表的長度為0
if (!L->elem)
printf("建立順序表失敗\n");
}
Status inputsqlist(SqList * L)//按照順序輸入數據
{
system("cls");//清屏
int l, n = 0;
printf("請輸入學生的數量:");
scanf("%d", &l);
/*依次輸入l名學生的數據*/
while (n < l) {
if (n >= 100) {
printf("內存超限\n");
return 0;
}
/*輸入第n名學生的數據*/
printf("第%d位學生信息\n", n + 1);
printf("\n");
printf("學號:");
scanf("%s", L->elem[n].number);//輸入學生學號
printf("-----------------------------\n");
printf("姓名:");
scanf("%s", L->elem[n].name);//輸入學生姓名
printf("-----------------------------\n");
printf("成績:");
scanf("%d", &L->elem[n].score);//輸入學生成績
printf("-----------------------------\n");
L->length++;//增加數據長度
n++;
}
}
Status outputsqlist(SqList L)//按照位置顯示所有信息
{
system("cls");//清屏
int i = 0;
printf("所有學生的相關信息為:\n\n");//按位置依次顯示學生信息
while (i < L.length) {
printf("學號:%s 姓名:%s 成績:%d\n\n", L.elem[i].number, L.elem[i].name, L.elem[i].score);
i++;
}
return 1;
}
Status searchsqlist(SqList * L, Student e) //按照姓名對數據搜尋
{
for (int i = 0; i < L->length + 1; i++) {
if (!strcmp(L->elem[i].name, e.name)) //比較需要查找的值與
return i + 1;
}
}
Status locatesqlist(SqList L)//按照姓名查找
{
system("cls");//清屏
Student e;//需要查找的數據
int temp;//中間量
printf("請輸入你要查找的姓名:");
scanf("%s", e.name);//輸入需要查找的數據的姓名
temp = searchsqlist(&L, e);
if (temp != 0) /*如果找到數據則輸出該條數據的全部內容*/
printf("學號:%s 成績:%d\n\n", L.elem[temp - 1].number, L.elem[temp - 1].score);
else /*如果沒有找到與已經存入的數據相同的數據顯示失敗*/
printf("查找失敗!\n\n");
return 1;
}
Status insersqlist(SqList * L)//插入學生信息
{
system("cls");//清屏
int i, k = 0;//i是要插入的位置
Student e;
printf("請輸入你要插入的位置:");
scanf("%d", &i);
/*↓↓在L中第i個位置之前插入新的數據元素e,L的長度加1↓↓*/
if(i<1 || i > L->length + 1) /*不允許在第0個數據之前或者最后一個后的數據之后插入數據*/
{
printf("插入位置有誤\n");
return 0;
}
if (L->length >= MAXSIZE) {
printf("數據溢出\n");
return 0;
}
printf("請輸入插入學生信息:\n"); /*輸入所需要插入的學生的數據*/
printf("學號:");
scanf("%s", e.number);
printf("姓名:");
scanf("%s", e.name);
printf("成績:");
scanf("%d", &e.score);
if (i == L->length + 1) {/*如果插入的元素在最后一位則只用在最后的位置輸入數據無需移動其他數據的位置 */
L->elem[i - 1] = e;//使最后的數據改變為所要插入的數據
L->length++;//長度加1
return 1;
}
for (k = L->length - 1; k >= i - 1; --k)/*從最后一個元素開始每個元素向后移動位置並且長度改變 */
L->elem[k + 1] = L->elem[k];//第k+1元素后移
L->elem[i - 1] = e;////使第i改變為所要插入的數據
L->length++;//長度加1
return 1;
}
Status deletesqlist(SqList * L) //刪除指定位置學生記錄
{
system("cls");//清屏
int i, j = 0, k;//i指要刪除的數據的位置,j指循環的次數,k指當前循環次數所對應的元素的位置
printf("請輸入要刪除學生的位置:");
scanf("%d", &i);
if (i == 0 || i > L->length) {//如果需要刪除數據的位置沒有數據則刪除失敗
printf("刪除失敗");
return 0;
}
while (j <= L->length) {
if (L->length != j) //定位需要刪除的數據
j++;
else {
for (k =i; k < L->length; k++)
L->elem[k - 1] = L->elem[k]; //將后面元素依次前移
L->length--;//長度減1
break;
}
}
}
Status sumsqlist(SqList * L) //顯示學生總數
{
int sum = 0;
sum = L->length;//結構體SqList中的length表示數據的條數
printf("總學生個數為:%d\n\n", sum);
return 1;
}
int main()
{
int choice;
build(&L);//調用函數建立一個空表
do {/*顯示操作界面*/
printf("********************************************************************\n");
printf("* 1. 根據指定學生個數,逐個輸入學生信息,建立信息表; *\n");
printf("* 2. 顯示學生表中所有學生的相關信息; *\n");
printf("* 3. 根據姓名進行查找,返回此學生的學號和成績; *\n");
printf("* 4. 給定一個學生信息,插入到表中指定的位置; *\n");
printf("* 5. 刪除指定位置的學生記錄; *\n");
printf("* 6. 統計表中學生個數; *\n");
printf("* 0. 退出。 *\n");
printf("********************************************************************\n");
printf("* 郭睿玥算法第2次作業 *\n");
printf("\n");
printf("請選擇你要操作的選項:");
scanf("%d", &choice);//輸入需要進行的選項
printf("\n");
system("cls");//清屏
switch (choice) {
case 1:{
inputsqlist(&L);//調用函數依位置輸入數據
break;
}
case 2:{
outputsqlist(L);//調用函數按位置的前后輸出數據
break;
}
case 3:{
locatesqlist(L);//調用函數按照姓名查找學生信息
break;
}
case 4:{
insersqlist(&L);//調用函數按照位置插入學生信息
break;
}
case 5:{
deletesqlist(&L);//調用函數按照刪除指定位置學生信息
break;
}
case 6:{
sumsqlist(&L);//調用函數統計學生總數
break;
}
case 0:{
printf("\n退出系統成功!請按任意鍵結束!\n");//退出程序
exit(0);
}
break;
}
} while (choice);//只要選擇不為需要進行的功能不為0則該程序可以一直進行下去
}
/*運行結果
操作界面如下
1. 根據指定學生個數,逐個輸入學生信息,建立信息表;
2. 顯示學生表中所有學生的相關信息;
3. 根據姓名進行查找,返回此學生的學號和成績;
4. 給定一個學生信息,插入到表中指定的位置;
5. 刪除指定位置的學生記錄;
6. 統計表中學生個數;
0. 退出。
郭睿玥 算法與數據結構第一次作業
(以下內容中操作界面的顯示已經省略)
輸入
請選擇你要操作的選項:1
請輸入學生的數量:5
學號;111
姓名;aaa
成績;60
學號;222
姓名;bbb
成績;70
學號;333
姓名;ccc
成績;80
學號;444
姓名;ddd
成績;50
學號;555
姓名;eee
成績;40
請選擇你要操作的選項:2
顯示為
學號;111 姓名;aaa 成績;60
學號;222 姓名;bbb 成績;70
學號;333 姓名;ccc 成績;80
學號;444 姓名;ddd 成績;50
學號;555 姓名;eee 成績;40
輸入
請選擇你要操作的選項:3
你要查找的姓名;ccc
顯示為學號;333 成績;80
請選擇你要操作的選項:4
請選擇你要插入的位置:6
學號:888 姓名;fff 成績;88
請選擇你要操作的選項:5
你要刪除的位置;1
請選擇你要操作的選項:6
總學生個數為:5
請選擇你要操作的選項:2
學號;222 姓名;bbb 成績;70
學號;333 姓名;ccc 成績;80
學號;444 姓名;ddd 成績;50
學號;555 姓名;eee 成績;40
學號;666 姓名;fff 成績;88
請選擇你要操作的選項:0
退出系統成功!
*/