3

我正在使用链表编写程序(这样的噩梦)。

无论如何,该程序的目的是输入 8 个字符,然后让程序将字符打印回给您,并以相反的顺序打印出字符,当然使用链表。

到目前为止我得到了这个。它有很多问题(我认为)。

问题是

  • 当向用户询问字符时,它应该自动读取字符数量,而不必询问有多少字符

  • 此外,当它编译时,它会在屏幕上打印乱码,例如我刚刚运行它并打印了

    ¿r
      (àõ($ê¿¿  
    a¿r
    (àõ($ê¿¿  
    
    ¿r
      (àõ($ê¿¿  
    b¿r
       (àõ($ê¿¿  
    

这里需要很多帮助。将不胜感激!

课程代码

#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("%s  \n", cur->fname);
        cur=cur->next;
    }
    return;
}
4

1 回答 1

3

你有:

在插入:

char first[strsize];

scanf("%c", &first);  /* note the %c */

strcpy(cur->fname, first);

印刷中

printf("%s  \n", cur->fname);

您应该在参数列表中%s代替%c并因此更改&format为,因为它本身代表要存储字符串的位置的地址。formatformat

所以scanf调用应该如下所示

scanf("%s", first);

另一件事。如果你在print函数中指定了返回类型,那么你应该返回一些东西,或者让它什么都不返回(将返回类型声明为void)。不过,在这种情况下这不会造成任何问题。

阅读编译器向您抛出的警告消息,您会看到编译器实际上已经回答了您的问题。

我认为你需要做一些重新设计。例如,要遍历链表,您不需要反“j”。next您可以通过检查链接是否为 NULL来检测列表终止。

您的问题是反向打印字符或字符串,因此您需要编写一些其他打印功能而不是您所写的。

于 2011-06-17T03:59:37.530 回答