我有一个程序,要求用户输入一个单词,然后将他们输入的每个单词添加到链接列表中。当用户输入"END"
时,程序应列出所有节点。
我的问题是该程序仅将单词"END"
添加到列表中,并且当用户输入其他内容时,将触发else条件:打印出列表中的所有项目,但所有这些单词只是"END"
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node {
char word[32];
struct node *next;
};
int main() {
struct node *head = NULL, *cur = NULL;
char input[32];
while(1) {
cur = malloc(sizeof(struct node));
printf("Enter words: ");
scanf("%s", input);
if (strcmp(input, "END") == 0) {
cur->next = head;
strcpy(cur->word, input);
head = cur;
} else {
struct node *iter = head;
while (iter != NULL) {
printf("Contents: %s\n", iter->word);
iter = iter->next;
}
}
}
}
通过执行if语句来检查条件== 1
是否仅使用户仅继续输入单词,无论用户输入了什么内容,例如"END"
。
任何帮助将不胜感激。
答案 0 :(得分:2)
if语句中的条件
if (strcmp(input, "END") == 0)
表示存储在数组input
中的字符串等于字符串文字"END"
。因此,如果数组包含字符串"END"
,那么您将在列表中插入一个新节点。
此外,您还必须在此检查之后而不是在此之前为新节点分配内存。否则会有内存泄漏。
请注意您存在无限循环。
您需要释放所有分配的内存。
似乎您是说类似以下内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 32
struct node
{
char word[N];
struct node *next;
};
int main(void)
{
struct node *head = NULL;
char input[N];
printf( "Enter words: " );
while ( scanf( "%31s", input ) == 1 )
{
char tmp[N];
size_t i = 0;
while ( ( tmp[i] = toupper( ( unsigned char )input[i] ) ) != '\0' ) ++i;
if ( strcmp( tmp, "END" ) == 0 ) break;
struct node *current = malloc( sizeof( struct node ) );
strcpy( current->word, input );
current->next = head;
head = current;
}
for ( struct node *current = head; current != NULL; current = current->next )
{
printf( "%s -> ", current->word );
}
puts( "NULL" );
while ( head != NULL )
{
struct node *current = head;
head = head->next;
free( current );
}
return 0;
}
程序输出看起来像
Enter words: Jackson Jake Hello end
Hello -> Jake -> Jackson -> NULL
答案 1 :(得分:1)
首先,需要在比较不为零时使用END
将字符串添加到列表中,直到输入字符串为strcmp() != 0
。
第二,创建当前的cur
节点,其中包含新的字符串,需要使用尾部指针添加新的字符串,如下所示,使用next
节点。另外,对于节点,您需要确保head
始终位于列表的开头。
第三,成功打印列表后,您需要break
,否则将永远结束while(1)
循环。
int main() {
struct node *head = NULL, *next = NULL, *cur = NULL;
char input[32];
while(1) {
printf("Enter words: ");
scanf("%s", input);
if (strcmp(input, "END") != 0) {
cur = malloc(sizeof(struct node));
cur->next = NULL;
strcpy(cur->word, input);
if (head == NULL) {
head = cur;
next = head;
}
next->next = cur;
} else {
struct node *iter = head;
while (iter != NULL) {
printf("Contents: %s\n", iter->word);
iter = iter->next;
}
break;
}
}