7-16 航空公司vip客戶查詢(25 分)
不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。
輸入首先給出兩個正整數n(
≤10
5)和
k(≤5
00)。其中
k是最低里程,即為照顧乘坐短程航班的會員,航空公司還會將航程低於
k公里的航班也按
k公里累積。隨後
n行,每行給出一條飛行記錄。飛行記錄的輸入格式為:18位身份證號碼(空格)飛行里程
。其中身份證號碼由17位數字加最後一位校驗碼組成,校驗碼的取值範圍為0~9和x共11個符號;飛行里程單位為公里,是(0, 15 000]區間內的整數。然後給出乙個正整數m(
≤10
5),隨後給出
m行查詢人的身份證號碼。
對每個查詢人,給出其當前的里程累積值。如果該人不是會員,則輸出no info
。每個查詢結果佔一行。
4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4120104195510156021
110108198403100012
330106199010080419
33010619901008041x
800
15000
1000
no info
大體思路:
建立乙個不佔多少記憶體但是又很巨量的指標陣列
然後採用 身份證號處理 第6,10,14,16,17,18位 轉換為雜湊位址
然後將每個身份證號插入雜湊鍊錶(指標陣列)
**如下:
#include #include #include #include #define max 200000typedef struct node * hash;/** 雜湊鍊錶中的小單元**/
struct node;
int deal(char *arr) /**處理身份證號**/
int nextprime(int n) /**需要乙個(大於總數n的又是最小的)素數 為了是以此大小建立雜湊鍊錶後 鍊錶不一定塞滿但是查詢的效率會提高不少**/
return p;
}hash insert(hash h,int x,char *s) /** 雜湊鍊錶的插入 **/
else p=p->next; /** 下乙個小單元 如果最後沒有了 會是null 迴圈會結束**/
}/**然後我i們知道 指標為空,或者此指標指的小鍊錶中沒有此身份證號**/
p= (hash)malloc(sizeof(struct node)); /**那就建立乙個**/
strcpy(p->arr,s);
p->fen=x;
p->next=h; /**鍊錶的頭節點插入的寫法,在此處比較方便**/
return p; /**返回新建的節點(此節點的next已經指向了原h所指的東西)給h 畢竟 給拿走了,得把自己和拿走的一起交回去了**/
}void display(hash h,char *s) /**輸入鍊錶的符合條件的身份證號**/
h=h->next;
}printf("no info\n");
}int main()
int x,idex; /**然後剩下的就沒啥難度了**/
char arr[20];
while(n--)
int m;
scanf("%d\n",&m);
while(m--)
return 0;
}
雜湊表 C語言實現
這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容 關鍵字 直接計算出存放完整資料的記憶體位址。void list find by key list,key return p 為了解決根據關鍵字快速找到元素的存放位址,雜湊表應運而生。它通過某種演算法 雜湊函式 直接根據關鍵字計算...
c語言實現雜湊表
雜湊表大家都在資料結構中學習過,應該是查詢最快的一種資料結構了,最好的情況下可以達到線性的時間複雜度。鍵key的狀態碼如果為 vt undefined 的話那麼就是這個槽位沒有被占用或者已經被刪除了 值value的狀態碼有vt true和vt false兩種,只要這個槽位已經被占用過了,那麼valu...
演算法總結 鍊錶 c語言實現
1.單鏈表的建立 頭插 尾插 2.迴圈鍊錶 include include typedef struct node g main 找到第乙個鍊錶的最後乙個節點 q head link while q link null q link head1 link 讓最後乙個節點的link指向head1的下乙...