读书人

插入结果异常求原因

发布时间: 2012-03-30 17:32:09 作者: rapoo

插入,结果错误,求原因
#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);
}

[解决办法]

C/C++ code
#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);}
[解决办法]
C/C++ code
#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楼说的好!

读书人网 >C语言

热点推荐