C中链表中的错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中链表中的错误相关的知识,希望对你有一定的参考价值。
程序在请求之前接受输入。输入第一个节点的值后,问题就开始了。
这是一个简单的程序,它从用户获取输入并将其存储在链表中,然后显示存储的数据。
#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:
");
scanf ("%d",&n);
first=(struct NODE*)malloc(sizeof(struct NODE));
first->next= NULL;
printf ("Enter value of node 1:
");
scanf ("%d
",&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:
",i);
scanf("%d
",&new_node->data);
old->next=new_node;
old = new_node;
}
old=first;
while(old!= NULL)
{
printf("%d ",old->data);
old=old->next;
}
}
答案
问题是你的
中的scanf format specification,其中包含(强调我的意思):
在格式字符串中很少有常量(即不格式化占位符的字符),主要是因为程序通常不是为读取已知数据而设计的。例外是一个或多个空白字符,它们丢弃输入中的所有空白字符。
所以你的
意味着在每个数字之后输入的新行被忽略,并且下一个scanf()
没有完成,直到你输入另一个新行(你从第一个节点计数输入正确省略它)。
您需要做的就是从格式字符串中删除
,您的代码将按预期工作:
...
scanf ("%d
",&first->data);
...
scanf("%d
",&new_node->data);
...
请注意,您可以通过省略
格式字符串中的printf()
并在调用fflush(stdout)
之前调用scanf()
来输入与提示相同的行,例如:
printf ("Enter number of elements: ");
fflush(stdout);
scanf ("%d",&n);
这将为您提供更自然的对话。
另一答案
你可以像这样执行所有链表操作
#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
",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
");
}
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
");
}
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
",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
");
}
}
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("
size %d
",sizeof(struct Node));
//insertFirst(start,10);
//insertLast(start,200);
// insertPosition(start,2,300);
// deleteFirst(start);
// deleteLast(start);
//deletePosition(start,2);
printList(start->next);
}
可以删除注释以执行该操作。
以上是关于C中链表中的错误的主要内容,如果未能解决你的问题,请参考以下文章