2011-06-02 56 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 */ 

我不确定你想要什么,因为你的问题非常模糊。

相关问题