我有一个程序,要求用户输入一个单词,他们输入的每个单词都会添加到链表中。当用户输入"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: %sn", iter->word);
iter = iter->next;
}
}
}
}
通过使 if 语句检查条件是否== 1
它只是让用户继续输入单词,而不管用户输入什么,例如"END"
.
任何帮助将不胜感激。
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] ) ) != ' ' ) ++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
首先,您需要将字符串添加到列表中,直到在比较不为零时使用strcmp() != 0
END
输入字符串。
其次,创建包含新字符串添加的当前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: %sn", iter->word);
iter = iter->next;
}
break;
}
}