什么错了?这段代码没有在链表的开头插入元素

时间:2016-08-14 11:48:41

标签: c

  

在开头添加元素的链接列表   我想在开始时添加,但它只接受第一个元素然后   treminate   它不接受while循环错误的其他元素

#include <stdio.h>

typedef struct node_type {
    int data; struct node_type *next;
} node;
typedef node* list;

void main() {
    list head,temp; int n; char ch;

    head = NULL;
    printf("\n Enter the data:(y/n):");
    scanf("%c", &ch);

    while (ch == 'y' || ch == 'Y') {
        printf("\n Enter Element:");
        scanf("%d", &n);
        temp = (list) malloc(sizeof(node));
        temp->data = n;
        temp->next = head;

        head = temp;
        printf("\n Enter more data:");
        scanf("%c", &ch);

    }

    temp = head;
    while (temp != NULL) {
        printf("%d", temp->data);
        temp = temp->next;
    }
}

4 个答案:

答案 0 :(得分:2)

对于根据C标准函数的启动器,没有参数的main应声明为

int main( void )

变量scanf的函数ch调用的格式字符串必须如下所示

scanf( " %c", &ch );
       ^^^^^^

在这种情况下,将跳过包含新行字符的空格字符。否则该函数将返回控制字符。您还应该检查是否有流的结束。

while循环可能看起来像

printf( "\nEnter the data:(y/n): " );

while ( scanf( " %c", &ch ) == 1 && ( ch == 'y' || ch == 'Y' ) ) 
{
    printf( "\nEnter Element: " );
    scanf( "%d", &n );

    temp = (list) malloc( sizeof( node ) );

    if ( temp != NULL )
    {
        temp->data = n;
        temp->next = head;

        head = temp;
    }

    printf( "\nEnter more data: " );
}

答案 1 :(得分:1)

您应该更改阅读y/n回复的方式:

scanf(" %c", &ch);

在格式字符串中添加空格会指示scanf跳过任何空格字符,包括您尝试使用fflush(stdin);删除的待处理换行符,这会调用未定义的行为。

同时检查scanf()的返回值:它应为1,否则转换不成功。

答案 2 :(得分:0)

这是一个经过修改的代码。

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

typedef struct node_type {
    int data; 
    struct node_type *next;
}list;

int main() {
    list *head, *temp; int n; char ch;

    head = NULL;
    printf("\n Enter the data:(y/n):");
    scanf("%c", &ch);

    while (ch == 'y' || ch == 'Y') {
        printf("\n Enter Element:");
        scanf("%d", &n);

        // Inserting a node into linked list at beginning:
        // 1. Create a node and initialize its values
        //    Make sure that the next field points to current head node
        temp = (list*) malloc(sizeof(list));
        temp->data = n;
        temp->next = head;

        // 2. Update the head pointer so that it points to newly created node
        head = temp;

        printf("\n Enter more data:");
        scanf(" %c", &ch);

    }

    temp = head;
    while (temp != NULL) {
        printf("%d", temp->data);
        temp = temp->next;
    }
    return 0;
}

编辑:我也做了与@Vlad和@chqrlie提到的相同的事情。

答案 3 :(得分:-1)

stdio.h中没有定义NULL,您应该使用#define宏手动定义它,或者使用stddef.hstdlib.h。最好使用{{1}因为它清除输入缓冲区(这会消除未解决的错误,同时在字符和整数上处理fflush(stdin))。它在scanf()预定义