| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1083 人关注过本帖
标题:生成一組不重複亂數的程式
只看楼主 加入收藏
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:27 
生成一組不重複亂數的程式
小弟初來報到,自學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编辑过]

2015-12-01 17:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
請依序存放隨機產生的節點,每產生一個不重複號碼後,才透過動態記憶體malloc()要求配置一個節點。
你的代碼這個要求不是很滿足,不過可以將就。

沒時間黏贴你的代碼撿查,依描述看,通常是指針錯誤,首先你想辦法追踪出在哪行發生錯誤。設斷點加上單步追踪,就可以找出來的。

授人以渔,不授人以鱼。
2015-12-01 17:52
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 17:52:48的发言:

請依序存放隨機產生的節點,每產生一個不重複號碼後,才透過動態記憶體malloc()要求配置一個節點。
你的代碼這個要求不是很滿足,不過可以將就。

沒時間黏贴你的代碼撿查,依描述看,通常是指針錯誤,首先你想辦法追踪出在哪行發生錯誤。設斷點加上單步追踪,就可以找出來的。



我不會用我的ide除錯,我使用的是Dev-C++ 5.11 版本
有相關的資料可以參考嗎,謝謝
2015-12-01 17:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
沒有IDE就用代碼調試,添加調試代碼。這是必備技能,最好自己學會。別人替你調試也可以,不過這樣就錯過了學習機會。

授人以渔,不授人以鱼。
2015-12-01 18:02
我爱吃青菜
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:190
专家分:500
注 册:2015-3-29
收藏
得分:0 
看这用词像台湾同胞呀
2015-12-01 18:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你這是連編譯都沒通過,怎麽説運行錯誤?

授人以渔,不授人以鱼。
2015-12-01 18:07
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 18:02:55的发言:

沒有IDE就用代碼調試,添加調試代碼。這是必備技能,最好自己學會。別人替你調試也可以,不過這樣就錯過了學習機會。



是指這個嗎
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-12-01 18:07
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 18:07:38的发言:

你這是連編譯都沒通過,怎麽説運行錯誤?



我按編譯並執行就這樣了
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-12-01 18:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有未完成的函數(聲明了沒定義),一開始就報你的L未初始化就使用了(main()中第3句)。

授人以渔,不授人以鱼。
2015-12-01 18:12
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 18:12:09的发言:

有未完成的函數(聲明了沒定義),一開始就報你的L未初始化就使用了(main()中第3句)。



改成這樣?
nodePointer L=NULL;
2015-12-01 18:14
快速回复:生成一組不重複亂數的程式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023813 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved