生成一組不重複亂數的程式
小弟初來報到,自學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编辑过]









