我正在编写一个程序来实现C.中的链表。这是我的程序。
/*Implementing a singly linked list in c*/
#include<stdio.h>
#include<stdlib.h>
#include<alloca.h>
struct node{
int data;
struct node* link;
}*start=NULL;
void main(){
char choice;
int data;
do{
printf("Enter data\n");
scanf("%d",&data);
struct node* temp;
temp=(struct node*)malloc(sizeof(struct node));
temp->data=data;
temp->link=NULL;
if(start==NULL)
start=temp;
else
{
struct node* traversing_pointer;
traversing_pointer=start;
while(traversing_pointer!=NULL)
traversing_pointer=traversing_pointer->link;
traversing_pointer->link=temp;
}
printf("Do you want to enter more");
choice=getchar();
}
while(choice=='y'|| choice=='Y');}
我基本上希望创建链表中的至少一个节点,这就是我使用do,while循环的原因。但是在第一次数据输入之后,程序终止而不接受choice
变量的输入。这是我的输出。什么可以是
Enter data
45
Do you want to enter more
RUN FINISHED; exit value 10; real time: 2s; user: 0ms; system: 0ms
可能出现的错误是什么?
答案 0 :(得分:2)
要使用输入流中留下的换行符,请执行:
scanf("%d",&data);
getchar(); //To consume a newline
或使用循环读取所有换行符。
scanf("%d",&data);
int c=0;
while ((c = getchar()) != '\n' && c != EOF) ; // Read & ignore all newlines
我看到的另一个问题是你没有正确链接节点。您希望将新节点链接为最后一个节点。所以你必须遍历到最后一个节点(直到你达到NULL)。将循环条件更改为:
while(traversing_pointer->link!=NULL)
traversing_pointer=traversing_pointer->link;
traversing_pointer->link=temp;
答案 1 :(得分:1)
这是因为getchar
在45
输入后按Enter键,您的{{1}}会读取您输入的行尾。