將學生的信息,以順序表的方式存儲(堆區),并且實現封裝函數 :
1】順序表的創建,
2】判滿、
3】判空、
4】往順序表里增加學生信息、
5】遍歷學生信息
6】任意位置插入學生信息
7】任意位置刪除學生信息
8】修改學生信息
9】查找(按學生的學號查找)、
10】刪除重復學生信息
11】銷毀順序表
主函數main.c?
#include "stu.h"
int main()
{ int i; stu_p S = stu_create(); if(NULL == S) return 0; else { do { printf("1.添加學生信息\t"); printf("2.遍歷學生信息\t"); printf("3.插入學生信息\t"); printf("4.刪除學生信息\n"); printf("5.查找學生信息\t"); printf("6.修改學生信息\t"); printf("7.刪除重復信息\t"); printf("8.退出信息系統\n"); printf("請輸入選項:"); scanf("%d", &i); switch(i) { case 1:stu_add(S);break; case 2:stu_show(S);break; case 3:stu_insert(S);break; case 4:stu_delet(S);break; case 5:stu_find(S);break; case 6:stu_change(S);break; case 7:stu_repeatdel(S);break; case 8:stu_free(S);printf("已退出\n");break; default:printf("沒有這個選項,請重新選擇"); } }while(8 != i); } return 0;
}
?功能函數stu.c
#include"stu.h" //申請順序表空間
stu_p stu_create()
{ //申請數據結構大小的堆空間 stu_p S = (stu_p)malloc(sizeof(stu)); if(NULL == S) { printf("申請順序表失敗"); return NULL; } memset(S -> name, 0, sizeof(S -> name)); memset(S -> id, 0, sizeof(S -> id)); S -> len = 0; printf("申請順序表成功\n"); return S;
} //添加學生信息
void stu_add(stu_p S)
{ if(stu_full(S)) { printf("滿\n"); return; } printf("請輸入學生姓名:"); scanf("%s", S -> name[S -> len]); printf("請輸入學生id:"); scanf("%d", &S -> id[S -> len]); S -> len++; stu_show(S);
}
//位插信息
void stu_insert(stu_p S)
{ if(stu_full(S)) { printf("滿\n"); return; } printf("請輸入要插入的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0 || in > MAX) { printf("所選位置錯誤\n"); return; } //將插入的位置空出來 for(int i = S -> len; i >= in; i--) { S -> id[i] = S -> id[i - 1]; strcpy(S -> name[i], S -> name[i - 1]); } printf("請輸入學生姓名:"); scanf("%s", S -> name[in - 1]); printf("請輸入學生id:"); scanf("%d", &S -> id[in - 1]); S -> len++; stu_show(S);
} //位刪信息
void stu_delet(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("請輸入要刪除的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0) { printf("所選位置錯誤\n"); return; } for(int i = in - 1; i < S -> len; i++) { S -> id[i] = S -> id[i + 1]; strcpy(S -> name[i], S -> name[i + 1]); } S -> len--; stu_show(S);
}
//位改
void stu_change(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("請輸入要修改的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0) { printf("所選位置錯誤\n"); return; } printf("請輸入學生姓名:"); scanf("%s", S -> name[in - 1]); printf("請輸入學生id:"); scanf("%d", &S -> id[in - 1]); stu_show(S);
}
//查找學生信息
void stu_find(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("請輸入學生的ID:"); int ID, i = 0; scanf("%d", &ID); do { if(S -> id[i] == ID) { printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); return; } i++; }while(i <= S -> len); printf("沒有這個學生\n"); }
//刪重
void stu_repeatdel(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } for(int i = 0; i < S -> len; i++) { //遍歷后面的值 for(int j = i + 1; j < S -> len; j++) { //重復的進行刪除 if(S -> id[i] == S -> id[j]) { for(int k = j; k < S -> len; k++) { S -> id[k] = S -> id[k + 1]; strcpy(S -> name[k], S -> name[k + 1]); } S -> len--; j--;//對刪除后位置的值進行重新對比 } } } stu_show(S);
} //釋放堆空間
void stu_free(stu_p S)
{ free(S); S = NULL;
}
//判空
int stu_null(stu_p S)
{ return 0 == S -> len;
} //判滿
int stu_full(stu_p S)
{ return MAX == S -> len;
} //回顯順序表
void stu_show(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("——————————————\n"); for(int i = 0; i < S -> len; i++) printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); printf("——————————————\n");
}
?功能函數頭文件stu.h
#ifndef __STU_H__
#define __STU_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX 8typedef struct student
{char name[MAX][24];int id[MAX];int len;
}stu, *stu_p;stu_p stu_create();
int stu_full(stu_p S);
int stu_null(stu_p S);
void stu_add(stu_p S);
void stu_show(stu_p S);
void stu_insert(stu_p S);
void stu_delet(stu_p S);
void stu_change(stu_p S);
void stu_find(stu_p S);
void stu_repeatdel(stu_p S);
void stu_free(stu_p S);
#endif
?實現效果
申請順序表成功
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:1
——————————————
[1]姓名:1 ID:1
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:2
請輸入學生id:2
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:3
請輸入學生id:3
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:4
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:1 ID:4
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:5
請輸入學生的ID:4
[4]姓名:1 ID:4
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:6
請輸入要修改的位置:4
請輸入學生姓名:4
請輸入學生id:4
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:5
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:1
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
[6]姓名:1 ID:1
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:7
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
——————————————
1.添加學生信息 2.遍歷學生信息 3.插入學生信息 4.刪除學生信息
5.查找學生信息 6.修改學生信息 7.刪除重復信息 8.退出信息系統
請輸入選項:8
已退出
一個學生信息還可封裝在一個學生結構體中,使用順序結構體嵌套學生結構體。
此方法在一個學生的信息較多時可以使用,方便學生信息覆蓋時代碼的書寫。
?
-
順序表
-
順序存儲的線性表
-
實現存儲的方式
-
使用數組存儲元素,實現邏輯上相連,物理內存也相連
-
使用malloc在堆區申請一片連續的空間,來存放邏輯相連的數據
-
-
順序表的組成
-
需要有一個能夠存儲數據元素的容器,可以是數組,也可以是連續的堆區空間
-
還需有一個變量來記錄當前順序表的長度(存儲元素的個數)
-
-
順序表的結構體原型
-
typedef struct sequence { int data[max];//元素 int len;//長度 }seq, *seq_p; //類型重定義結構體,結構體指針
-
結構體使用.引出結構體變量 結構體指針使用->引出結構體變量
-
-
順序表的相關函數操作
-
創建順序表
-
在堆區申請空間,返回給main使用
-
函數返回值類型:順序表類型的指針
-
函數名:符合命名規則
-
參數列表:無
-
注意事項
-
申請堆區空間后,判斷是否成功
-
申請成功后,需要將順序表的長度(為0)和數組初始化
-
-
-
判滿
-
函數功能
-
判斷順序表存儲空間是否存滿,即len == max
-
-
函數返回值
-
邏輯判斷,存滿返回1,不滿返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
-
判空
-
函數功能
-
判斷順序表是否為空(即len是否為0)
-
-
函數返回值
-
邏輯判斷,為空返回1,有元素返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
-
數據存儲
-
函數功能
-
將數據存入順序表
-
-
函數返回值
-
邏輯值:成功返回1,失敗返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
注意事項
-
判斷順序表是否為滿
-
-
-
遍歷
-
函數的功能
-
依次打印輸出順序表里的數據
-
-
函數返回值
-
void
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
注意事項
-
判斷順序表是否為空
-
-
-
按位置插入
-
函數的功能
-
輸入位置和數據存入數據表
-
-
函數返回值
-
邏輯值:成功返回1,失敗返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
函數內部需要外部傳參插入位置和存入數據
-
-
注意事項
-
判斷順序表是否為滿
-
插入位置是否合理
-
-
-
按位置刪除
-
函數的功能
-
輸入位置將數據表中對應的數據刪除
-
-
函數返回值
-
邏輯值:成功返回1,失敗返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
函數內部需要外部傳參刪除位置
-
-
注意事項
-
判斷順序表是否為空
-
刪除位置是否合理
-
-
-
修改數據
-
函數的功能
-
輸入位置將數據表中對應的數據修改
-
-
函數返回值
-
邏輯值:成功返回1,失敗返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
函數內部需要外部傳參修改位置
-
-
注意事項
-
判斷順序表是否為空
-
修改位置是否合理
-
-
-
查找數據
-
函數的功能
-
輸入數據查找對應的數據的位置
-
-
函數返回值
-
找到返回位置,找不到返回0
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
函數內部需要外部傳參數據
-
-
注意事項
-
判斷順序表是否為空
-
-
-
去重
-
函數的功能
-
刪除重復數據
-
-
函數返回值
-
void
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
注意事項
-
判斷順序表是否為空
-
-
-
銷毀
-
函數的功能
-
釋放堆空間
-
-
函數返回值
-
void
-
-
函數名
-
符合命名規則
-
-
參數列表
-
順序表(傳順序表的地址)
-
-
-
-