2011-06-02 55 views
1

嘿,夥計們,我在這個程序中遇到了一些麻煩。我覺得我有差不多吧,除了它打印垃圾到屏幕:(C Progamming-輸入3個字符並按相反順序打印

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define strsize 30 

typedef struct member 
{ 
    int number; 
    char fname[strsize]; 
    struct member *next; 
} RECORD; 

RECORD* insert (RECORD *it); 
RECORD* print(RECORD *it, int j); 

int main (void) 
{ 
    int i, result; 
    RECORD *head, *p; 
    head=NULL; 
    printf("Enter the number of characters: "); 
    scanf("%d", &result); 

    for (i=1; i<=result; i++) 
     head=insert (head); 

    print (head, result); 

    return 0; 
} 

RECORD* insert (RECORD *it) 
{ 
    RECORD *cur, *q; 
    int num; 
    char junk; 
    char first[strsize]; 
    printf("Enter a character:"); 
    scanf("%c", &first); 

    cur=(RECORD *) malloc(sizeof(RECORD)); 

    strcpy(cur->fname, first); 
    cur->next=NULL; 

    if (it==NULL) 
     it=cur;  
    else 
    { 
     q=it; 

     while (q->next!=NULL) 
      q=q->next; 

     q->next=cur; 
    } 

    return (it); 
} 

RECORD* print(RECORD *it, int j) 
{ 
    RECORD *cur; 
    cur=it; 
    int i; 

    for(i=1;i<=j;i++) 
    { 
     printf("%c \n", cur->fname); 
     cur=cur->next; 
    } 

    return; 
} 

幫助表示讚賞的事實!謝謝

+0

爲什麼不給我們一點關於你想要完成什麼的更多細節,而不是將所有的代碼轉儲到我們的頂端,期待我們爲你調試?並且爲了將來的參考,您可能希望獲取正確的語言名稱。 – Marlon 2011-06-02 01:17:17

+0

我的不好,它是C.它應該提示用戶輸入3個字符並按相反順序輸出3個字符到屏幕 – James 2011-06-02 01:21:34

+0

並且它應該用鏈表來解決,對不對?爲什麼你會用它們呢?它很容易就像「char a,b,c; cin >> a >> b >> c; cout << c << b << a」。 – SinistraD 2011-06-02 01:23:42

回答

3

快退一步;我想建議基於我從你的代碼中看到一些常規編程指南:

RECORD* insert (RECORD *it) 
{ 
    RECORD *cur, *q; 
    int num; 
    char junk; 
    char first[strsize]; 
    printf("Enter a character:"); 
    scanf("%c", &first); 

    cur=(RECORD *) malloc(sizeof(RECORD)); 

上適用於複雜的數據結構記錄的insert()程序通常不預期/允許/所需執行的用戶交互;您正在混合用戶界面內部業務邏輯。 (雖然業務邏輯high-falutin短語,但我不知道更好的方式來說「你的程序爲了證明它的存在而必須做的事情」或「程序必須滿足的基本要求」。 :)

考慮這個僞代碼作爲替換算法:

while we need more characters 
    prompt user for another character 
    store character in datastructure 
print datastructure in reverse 

單獨所有的數據結構互動與人的代碼。 (這從邏輯表現的分離往往形式化爲 Model View Controller,但要認識到它是受限於用戶界面是非常重要的 - 你想你的堆棧,列表或隊列在你的下一個編程有用項目,所以建立一個堆棧,列表或隊列操作的通用程序,你可以下一個項目重用他們。)


更新

編寫一個程序,該程序創建鏈接的 10個字符的列表,然後以相反的順序創建列表的 副本。該 應提示用戶輸入 人物和程序應該有 打印出的 原來的列表,然後打印出 單子

現在更像打印功能它。儘管我很欣賞你的老師試圖做的事情,但是鏈表並不是我爲這個問題選擇的數據結構。 (我會選一個數組,如果這個問題大小,堆棧如果問題大小是無限的。)這是可以解決的一個鏈表,並且有馬上想到的三種可能的途徑:

  • 寫遞歸輸出功能的工作原理是這樣的:

    void print_output(RECORD *r) { 
        if this is the last RECORD in the chain 
         print the data 
        else 
         print_output(next record in the chain) 
    } 
    

    它使用call stack反向輸出。聰明的伎倆,但有時與其他方法相比浪費內存。

  • 使用雙向鏈表列表元素編寫您的列表。同時使用nextprev指針,並仔細管理它們以允許您在任一方向遍歷列表。這需要微妙的編碼和仔細思考。或者從Knuth或您最喜愛的算法文本等已發佈的源中複製正確的操作順序。 :)

  • 其實reverse your singly-linked list。還需要微妙,仔細的編碼或周到的複製。 :)

+0

真的很好的答案 – SinistraD 2011-06-02 09:16:00

1

在你RECORD* print(RECORD *it, int j)功能,你告訴的printf要打印字符,但你是一個指針傳遞給第一個元素在你的fname陣列,這是一個內存地址

二者必選其一:

printf("%s \n", cur->fname); /* print the string */ 

printf("%c \n", *cur->fname); /* print the first character */ 

我不確定你想要什麼,因爲你的問題非常模糊。

相關問題