生成一組不重複亂數的程式
小弟初來報到,自學C語言已有一段時間下面這個程式是一個生成一組不重複亂數的程式,使用鏈結串列作資料結構
大部分的程式碼都是從書上東抄一些,西抄一些而成的
編譯成功但執行時發生了未知錯誤, 跪求大大們幫忙看一下,謝謝!
而這程式其實是在回答書上的一道題目: 請使用鏈結串列存放大樂透開獎之號碼。每個節點包含號碼與鏈結,最後一個節點則為特別號節點。
請依序存放隨機產生的節點,每產生一個不重複號碼後,才透過動態記憶體malloc()要求配置一個節點。
程序代码:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct Node { int data; struct Node *link; }; typedef struct Node node; typedef node *nodePointer; /* 函式宣告 */ nodePointer GetNode(); void EorrorExit(); nodePointer insertFirst(nodePointer L, int d); nodePointer last(nodePointer L); nodePointer inserLast(nodePointer L, int d); int SeqSearch(nodePointer L, int d); nodePointer generate_lotto(nodePointer L, int ball_qty); void showdata(nodePointer L); nodePointer GetNode() /* 產生新節點 */ { nodePointer NewNode; NewNode=(nodePointer) malloc(sizeof(node)); if(NewNode==NULL) { printf("記憶體不足!"); exit(1); } return NewNode; } void ErrorExit() { printf("error"); exit(1); } nodePointer insertFirst(nodePointer L, int d) /* 產生新串列 */ { nodePointer n; n=GetNode(); n->data=d; n->link=L; L=n; return L; } nodePointer last(nodePointer L) /* 尋找串列的最後一個節點並回傳 */ { nodePointer Trace; if(L==NULL) ErrorExit(); Trace=L; while(Trace->link!=NULL) Trace=Trace->link; return Trace; } nodePointer insertLast(nodePointer L, int d) /* 將節點插入串列的最後 */ { nodePointer n, LastNP; if(L==NULL) L=insertFirst(L,d); else { n=GetNode(); LastNP=last(L); n->data=d; n->link=NULL; LastNP->link=n; } return L; } int SeqSearch(nodePointer L, int d) /* 搜尋新產生的隨機數是否有重複 */ { nodePointer Trace; Trace=L; while(Trace->link!=NULL) { if(Trace->data==d) return 0; else Trace=Trace->link; } return -1; } nodePointer generate_lotto(nodePointer L, int ball_qty) /* 產生隨機數,呼叫搜尋函式,如沒有重複則呼叫插入節點函式將新的隨機數插入到串列的最後 */ { int generate_num, i; srand((unsigned) time(NULL)); for(i=0;i<ball_qty;i++) { generate_num=rand()%49+1; while(SeqSearch(L, generate_num)!=-1) generate_num=rand()%49+1; L=insertLast(L, generate_num); } generate_num=rand()%49+1; while(SeqSearch(L, generate_num)!=-1) generate_num=rand()%49+1; L=insertLast(L, generate_num); return L; } void showdata(nodePointer L) /* 依序將串列的隨機數輸出 */ { nodePointer Trace; Trace=L; while(Trace->link!=NULL) { printf("%d\t", Trace->data); Trace=Trace->link; } } int main() { nodePointer L; int ball_qty=6; L=generate_lotto(L, ball_qty); showdata(L); free(L); return 0; }
[此贴子已经被作者于2015-12-1 17:53编辑过]