程序在请求之前接受输入。输入第一个节点的值后,问题就开始了。
这是一个简单的程序,它从用户那里获取输入并将其存储在链表中,然后显示存储的数据。
#include<stdio.h>
#include<stdlib.h>
struct NODE
{
int data;
struct NODE* next;
};
void main()
{
struct NODE *first,*old,*new_node;
int n,i;
printf ("Enter number of elements: \n");
scanf ("%d",&n);
first=(struct NODE*)malloc(sizeof(struct NODE));
first->next= NULL;
printf ("Enter value of node 1: \n");
scanf ("%d\n",&first->data);
old = first;
for(i=2;i<=n;i++)
{
new_node=(struct NODE*)malloc(sizeof(struct NODE));
new_node->next= NULL;
printf("Enter value of node %d: \n",i);
scanf("%d\n",&new_node->data);
old->next=new_node;
old = new_node;
}
old=first;
while(old!= NULL)
{
printf("%d \t",old->data);
old=old->next;
}
}
答案 0 :(得分:1)
问题是scanf format specification中的\n
,其中包含(强调我的意思):
很少有常量(即不格式化的字符) 占位符)格式字符串,主要是因为程序通常 不是为了读取已知数据。 例外是一个或多个 空白字符,丢弃所有空白字符 输入强>
因此,\n
表示您忽略了在每个号码后输入的换行符,并且在您输入另一个新词之前,下一个scanf()
未完成-line(您从第一个节点计数输入中正确省略它)。
您需要做的就是从格式字符串中删除\n
,您的代码将按预期运行:
...
scanf ("%d\n",&first->data);
...
scanf("%d\n",&new_node->data);
...
请注意,您可以在提示的同一行输入,省略\n
格式字符串中的printf()
并在调用fflush(stdout)
之前调用scanf()
,例如:< / p>
printf ("Enter number of elements: ");
fflush(stdout);
scanf ("%d",&n);
这将为您提供更自然的对话。
答案 1 :(得分:0)
您可以像这样
来表示所有链接列表操作 #include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct Node{
struct Node *next;
int data;
};
void printList(struct Node *n)
{
while (n != NULL)
{
printf(" %d ", n->data);
n = n->next;
}
}
void insertFirst( struct Node *start,int data1)
{
struct Node *n=(struct Node*)malloc(sizeof(struct Node));
n->data=data1;
n->next=start->next;
start->next=n;
}
void insertLast( struct Node *start,int data1)
{
struct Node *last,*previous;
last=start->next;
while(last!=NULL)
{
previous=last;
last=last->next;
}
struct Node *n=(struct Node*)malloc(sizeof(struct Node));
n->data=data1;
n->next=NULL;
previous->next=n;
}
void insertPosition(struct Node *start, int pos, int data1)
{
int count=0;
struct Node *node;
node=start->next;
while(node!=NULL)
{
count++;
node=node->next;
}
printf("total elements before insertion is %d\n ",count);
if(count+1<pos)
printf("cannot insert at desired position ");
else
{
int i=1;
node=start;
while(i<pos)
{
node=node->next;
i++;
}
struct Node *n=(struct Node*)malloc(sizeof(struct Node));
n->data=data1;
n->next=node->next;
node->next=n;
}
}
void deleteFirst(struct Node *start)
{
struct Node *firstNode;
firstNode= start->next;
start->next=firstNode->next;
free(firstNode);
printf("first node is removed\n");
}
void deleteLast(struct Node *start)
{
struct Node *last,*previous;
last=start;
while(last->next!=NULL)
{
previous=last;
last=last->next;
}
previous->next=NULL;
free(last);
printf("last node is removed\n");
}
void deletePosition(struct Node *start, int pos)
{
int count=0;
struct Node *node;
struct Node *previous;
node=start->next;
while(node!=NULL)
{
count++;
node=node->next;
}
printf("total elements before deletion is %d\n ",count);
if(count<pos)
printf("cannot delete the desired position ");
else
{
int i=1;
node=start->next;
while(i<pos)
{
previous=node;
node=node->next;
i++;
}
previous->next=node->next;
free(node);
printf("node is removed\n");
}
}
int main()
{
struct Node *start=NULL;
struct Node *node1=NULL;
struct Node *node2=NULL;
struct Node *node3=NULL;
struct Node *node=NULL;
start=(struct Node*)malloc(sizeof(struct Node));
node1=(struct Node*)malloc(sizeof(struct Node));
node2=(struct Node*)malloc(sizeof(struct Node));
node3=(struct Node*)malloc(sizeof(struct Node));
start->next=node1;
node1->data=1;
node1->next=node2;
node2->data=2;
node2->next=node3;
node3->data=3;
node3->next=NULL;
printf("\nsize %d\n",sizeof(struct Node));
//insertFirst(start,10);
//insertLast(start,200);
// insertPosition(start,2,300);
// deleteFirst(start);
// deleteLast(start);
//deletePosition(start,2);
printList(start->next);
}
可以删除注释以执行该操作。