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

看这用词像台湾同胞呀


我是香港的同胞
2015-12-01 18:16
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 18:17:31的发言:



你看,IDE把你代碼的錯誤行指示出來,generate_lotto(L, ball_qty)裏面的L就是未經初始化的,這樣使用,在執行時L是亂指針,就會出現這個典型的画面。你的編譯器本來是不應該讓這種代碼通過的。



難道是我的編譯器不行嗎
2015-12-01 18:19
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 18:31:30的发言:

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;
}

本來未初始化的指針傳參也可以通過在函式內部置値解决,但你的問題還是在裏面也直接使用了這個亂指針,就是描紅那裏。


謝謝TonyDeng大大,但我是時候要上班,讓我再研究一下,晚點再請你賜教,感激不盡
2015-12-01 18:37
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
TonyDeng大大,我剛剛改寫了SeqSearch函式,如下:
int SeqSearch(nodePointer L, int d)  /*  搜尋新產生的隨機數是否有重複  */
{
     nodePointer Trace;
     Trace=L;
     if(Trace==NULL)
          return -1;
     while(Trace->link!=NULL) {
         if(Trace->data==d)
             return 0;
         else
         Trace=Trace->link;
    }
    return -1;
}
然後在手機上的編譯器app測試成功了
在電腦上不知道能否成功,因為我在上班沒有電腦
2015-12-01 21:20
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
以下是引用TonyDeng在2015-12-1 22:18:44的发言:

雖然彆扭了一點,但也能通。


那麼正確的設計思路是什麼,想不通
2015-12-01 22:21
快速回复:生成一組不重複亂數的程式
数据加载中...
 
   



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

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