文章目錄
- 吐槽
- 實戰一:順序表操作函式
- 功能
- 定義結構體
- 匯入.h檔案
- 匯入.c 檔案
- 輸出函式
- 主函式
- 定義初始量
- 資料輸入并顯示
- 查找相應節點,并輸出該節點的內容
- 通過關鍵字key查找
- 總結
吐槽
不得不吐槽一下,對于我們專業,在學習譚浩強爺爺的C語言程式設計時(學了一學期,還是在家學的),就被該書的結構排版以及那些冗雜的解釋給整吐了,
嚴蔚敏奶奶的資料結構更是一頭霧水😭(不光我,還有我宿舍的,我專業的絕大部分,,,)從頭到尾晦澀難懂的偽代碼,讓編程更加抽象,哎,編程不實戰,力倍而功半,
當然不是說二老的不好,畢竟二老是那個年代,我國程式設計的引領者,都是因為我老師當時學計算機的教材就是這兩個(零幾年了),所以也給我們定了這兩套作為教材,但上一世紀的書呈現知識的形式確實讓現在的學生難以接受,
罷了,認真看看應付考試期末考試還是應該沒有問題的,但咱畢竟是想走演算法這條路的,所以資料結構必須給他整明白,
于是找了另一本書:《演算法學習與應用——從入門到精通》,
基礎內容就不說了,直接來實戰,
實戰一:順序表操作函式
功能
- 可以實作向順序表里添加內容
- 輸出順序表中的內容
- 通過關鍵詞查找順序表的某條內容
定義結構體
不懂結構體的可以先看一下我這篇文章:小白來學C語言之結構體
typedef struct{
char key[15]; //結點的關鍵字
char name[20];
int age;
} DATA; //定義節點型別,可定義為簡單型別,也可定義為結構
匯入.h檔案
- xx.h檔案 .h中一般放的是同名.c檔案中定義的變數、陣列、函式的宣告,需要讓.c外部使用的宣告,
- xx.c檔案 .c檔案一般放的是變數、陣列、函式的具體定義
一般.h檔案中是放了一些宏定義,不了解C語言宏的概念的可以先看一下這個文章:小白來學C語言之宏定義
#include "2-1 SeqList.h"
該2-1 SeqList.h檔案內容為:
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100 //定義線性表的最大長度
typedef struct //定義順序表結構
{
DATA ListData[MAXSIZE+1]; //保存順序表的陣列
int ListLen; //順序表已存結點 的數量
}SeqListType;
void SeqListInit(SeqListType *SL); //初始化順序表
int SeqListLength(SeqListType *SL); //回傳順序表的元素數量
int SeqListAdd(SeqListType *SL,DATA data); //向順序表中添加元素
int SeqListInsert(SeqListType *SL,int n,DATA data); //向順序表中插入元素
int SeqListDelete(SeqListType *SL,int n); //洗掉順序表中的據元素
DATA *SeqListFindByNum(SeqListType *SL,int n); //根據序號回傳元素
int SeqListFindByCont(SeqListType *SL,char *key); //按關鍵字查找
int SeqListAll(SeqListType *SL);//遍歷順序表中的內容
可以看到,上面.h檔案呼叫了多個函式,這些函式大都是存放在下面的.c檔案中的,
匯入.c 檔案
改.c檔案定義了多個函式,包括順序表的初始化,添加洗掉等功能,
void SeqListInit(SeqListType *SL) //初始化順序表
{
SL -> ListLen = 0; //初始化時,設定順序表長度為0
}
int SeqListLength(SeqListType *SL) //回傳順序表的元素數量
{
return (SL->ListLen);
}
int SeqListAdd(SeqListType *SL,DATA data) //增加元素到順序表尾部
{
if(SL->ListLen>=MAXSIZE) //順序表已滿
{
printf("順序表已滿,不能再添加結點了!\n");
return 0;
}
SL->ListData[++SL->ListLen] = data;
return 1;
}
int SeqListInsert(SeqListType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXSIZE) //順序表結點數量已超過最大數量
{
printf("順序表已滿,不能插入結點!\n");
return 0; //回傳0表示插入不成功
}
if(n<1 || n>SL->ListLen-1) //插入結點序號不正確
{
printf("插入元素序號錯誤,不能插入元素!\n");
return 0; //回傳0,表示插入不成功
}
for(i=SL->ListLen;i>=n;i--) //將順序表中的資料向后移動
SL->ListData[i+1]=SL->ListData[i];
SL->ListData[n]=data; //插入結點
SL->ListLen++; //順序表結點數量增加1
return 1; //回傳成功插入
}
int SeqListDelete(SeqListType *SL,int n) //洗掉順序表中的資料元素
{
int i;
if(n<1 || n>SL->ListLen+1) //洗掉元素序號不正確
{
printf("洗掉結點序號錯誤,不能洗掉結點!\n");
return 0; //回傳0,表示洗掉不成功
}
for(i=n;i<SL->ListLen;i++) //將順序表中的資料向前移動
SL->ListData[i]=SL->ListData[i+1];
SL->ListLen--; //順序表元素數量減1
return 1; //回傳成功洗掉
}
DATA *SeqListFindByNum(SeqListType *SL,int n) //根據序號回傳資料元素
{
if(n<1 || n>SL->ListLen+1) //元素序號不正確
{
printf("結點序號錯誤,不能回傳結點!\n");
return NULL; //回傳0,表示不成功
}
return &(SL->ListData[n]);
}
int SeqListFindByCont(SeqListType *SL,char *key) //按關鍵字查詢結點
{
int i;
for(i=1;i<=SL->ListLen;i++)
if(strcmp(SL->ListData[i].key,key)==0) //如果找到所需結點
return i; //回傳結點序號
return 0; //遍歷后仍沒有找到,則回傳0
}
輸出函式
int SeqListAll(SeqListType *SL) //遍歷順序表中的結點
{
int i;
for(i=1;i<=SL->ListLen;i++)
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
return 0;
}
主函式
定義初始量
int i;
SeqListType SL; //定義順序表變數
DATA data,*data1; //定義節點保存資料型別變數和指標變數
char key[15]; //保存關鍵字
SeqListInit(&SL); //初始化順序表
資料輸入并顯示
do { //回圈添加結點資料
printf("輸入添加的節點(學號 姓名 年齡):");
fflush(stdin); //清空輸入緩沖區
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age) //若年齡不為0
{
if(!SeqListAdd(&SL,data)) //若添加節點失敗
break; //退出死回圈
}else //若年齡為0
break; //退出死回圈
}while(1);
printf("\n順序表中的節點順序為:\n");
SeqListAll(&SL); //顯示所有結點資料
fflush(stdin); //清空輸入緩沖區 ,通常是為了確保不影響后面的資料讀取(例如在讀完一個字串后緊接著又要讀取一個字符,此時應該先執行fflush(stdin);,
查找相應節點,并輸出該節點的內容
printf("\n要取出節點的序號:");
scanf("%d",&i); //輸入節點序號
data1=SeqListFindByNum(&SL,i); //按序號查找結點
if(data1) //若回傳的節點指標不為NULL
printf("第%d個節點為:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
fflush(stdin); //清空輸入緩沖區
通過關鍵字key查找
printf("\n要查找節點的關鍵字:");
scanf("%s",key); //輸入關鍵字
i=SeqListFindByCont(&SL,key); //按關鍵字查找 ,回傳節點序號
data1=SeqListFindByNum(&SL,i); //按序號查詢,回傳節點指標
if(data1) //若節點指標不為NULL
printf("第%d個節點為:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
getch();
總結
整個c檔案為:
#include <stdio.h>
typedef struct
{
char key[15]; //結點的關鍵字
char name[20];
int age;
} DATA; //定義節點型別,可定義為簡單型別,也可定義為結構
#include "2-1 SeqList.h"
#include "2-2 SeqList.c"
int SeqListAll(SeqListType *SL) //遍歷順序表中的結點
{
int i;
for(i=1;i<=SL->ListLen;i++)
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
int main()
{
int i;
SeqListType SL; //定義順序表變數
DATA data,*data1; //定義節點保存資料型別變數和指標變數
char key[15]; //保存關鍵字
SeqListInit(&SL); //初始化順序表
do { //回圈添加結點資料
printf("輸入添加的節點(學號 姓名 年齡):");
fflush(stdin); //清空輸入緩沖區
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age) //若年齡不為0
{
if(!SeqListAdd(&SL,data)) //若添加節點失敗
break; //退出死回圈
}else //若年齡為0
break; //退出死回圈
}while(1);
printf("\n順序表中的節點順序為:\n");
SeqListAll(&SL); //顯示所有結點資料
fflush(stdin); //清空輸入緩沖區
printf("\n要取出節點的序號:");
scanf("%d",&i); //輸入節點序號
data1=SeqListFindByNum(&SL,i); //按序號查找結點
if(data1) //若回傳的節點指標不為NULL
printf("第%d個節點為:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
fflush(stdin); //清空輸入緩沖區
printf("\n要查找節點的關鍵字:");
scanf("%s",key); //輸入關鍵字
i=SeqListFindByCont(&SL,key); //按關鍵字查找 ,回傳節點序號
data1=SeqListFindByNum(&SL,i); //按序號查詢,回傳節點指標
if(data1) //若節點指標不為NULL
printf("第%d個節點為:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
getch();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/208090.html
標籤:其他
上一篇:Shift-GCN網路論文筆記
下一篇:作業系統之bios
