插入,结果错误,求原因
#include<stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define NULL 0
#define Element char
typedef struct Node
{
Element data;
struct Node *next;
}Node,*LinkList;
void initlist(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
LinkList GetFromHead(LinkList L)
{
Node *s;
char c;
int flag;
flag=1;
while(flag)
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}
else flag=0;
}
return L;
}
int inslist(LinkList L)
{
LinkList p,s;
int i,k;
Element n;
printf("请输入您要插入元素的值:");
scanf("%c",&n);getchar();
printf("请输入要插入元素的位置:");
scanf("%d",&i);
if(i<=0) return ERROR;
p=L;k=0;
while(p!=NULL&&k<i-1)
{
p=p->next;
k++;
}
if(p==NULL)
{
printf("插入的位置不合理!");
return ERROR;
}
s=(LinkList)malloc(sizeof(Node));
s->data=n;
s->next=p->next;
p->next=s;
return OK;
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
LinkList h,a;
initlist(&a);
h=GetFromHead(a);
print(h);
inslist(h);
print(h);
}
[解决办法]
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define NULL 0#define Element chartypedef struct Node{ Element data; struct Node *next;}Node,*LinkList;void initlist(LinkList *L){ *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL;}LinkList GetFromHead(LinkList L){ Node *s; char c; int flag; flag=1; while(flag) { c=getchar(); if(c!='$') { s=(Node*)malloc(sizeof(Node)); s->data=c; s->next=L->next; L->next=s; } else flag=0; } return L;}int inslist(LinkList L){ LinkList p,s,t;//小小改动 int i,k; Element n; fflush(stdin); printf("请输入您要插入元素的值:"); scanf("%c",&n); fflush(stdin); printf("请输入要插入元素的位置:"); scanf("%d",&i); if(i<=0) return ERROR; p=L; k=0; while(p!=NULL&&k<i-1) { p=p->next; k++; } if(p==NULL) { printf("插入的位置不合理!"); return ERROR; } s=(LinkList)malloc(sizeof(Node)); t=p;//小小改动 s->data=n; s->next=p->next; t->next=s;//小小改动 return OK;}void print(LinkList L){ LinkList p; p=L->next; while(p!=NULL) { printf("%c",p->data); p=p->next; } printf("\n");}void main(){ LinkList h,a; initlist(&a); h=GetFromHead(a); print(h); inslist(h); print(h);}
[解决办法]
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define Element chartypedef struct Node{ Element data; struct Node *next;} Node , *LinkList;void initlist( LinkList *L ){ *L = ( LinkList )malloc( sizeof( Node ) ); ( *L )->next = NULL;}LinkList GetFromHead( LinkList L ){ Node *s; char c; int flag; flag = 1; while( flag ) { c = getchar(); if( c != '$' ) { s = ( Node * )malloc( sizeof( Node ) ); s->data = c; s->next = L->next; L->next = s; } else { flag = 0; } } return L;}int inslist( LinkList L ){ LinkList p , s; int i , k; Element n; printf( "请输入您要插入元素的值:" ); getchar();//这里过滤之前输入$的时候的回车键 scanf( "%c" , &n ); getchar(); printf( "请输入要插入元素的位置:" ); scanf( "%d" , &i ); if( i <= 0 ) { return ERROR; } p = L; k = 0; while( p != NULL && k < i ) //这里不减1 { p = p->next; k++; } if( p == NULL ) { printf( "插入的位置不合理!" ); return ERROR; } s = ( LinkList )malloc( sizeof( Node ) ); s->data = n; s->next = p->next; p->next = s; return OK;}void print( LinkList L ){ LinkList p; p = L->next; while( p != NULL ) { printf( "%c" , p->data ); p = p->next; } printf( "\n" );}void main(){ LinkList h , a; initlist( &a ); h = GetFromHead( a ); print( h ); inslist( h ); print( h );}
[解决办法]
例如你输入asdf$,然后“回车”,这个“回车”实际上也进入了缓存中,如果不处理掉的话,在inslist函数中的scanf函数就会读取这个缓存中的内容,所以就加了个getchar()函数在scanf语句之前过滤掉这个“回车”输入
[解决办法]
清除掉多余的回车!
8楼说的好!