昨天在看同学代码的时候,发现计算链表长度函数返回结果总是正确结果的两倍,源码如下:
#include<stdio.h>
#include<malloc.h>
typedef char elemtype;
typedef struct node
{
elemtype data;//实际上就是char
struct node *next;
}LNode,*LinkList;
LinkList CreateFromHead()//增加结点
{
LinkList L;
LNode *s;
char c;
int flag=1;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
while(flag)
{
c=getchar();
if(c!='$') //以$为输入终止符,尾插法
{
s=(LinkList)malloc(sizeof(LNode));
s->data=c;
s->next=L->next;
L->next=s;
}
else
flag=0;
}
return L;
}
int ListLength(LinkList L)//计算链表长度
{
LinkList p;
p=L;
int j=0;
p=p->next;
while(p)
{
p=p->next;
j++;
}
return j;
}
int main()
{
LinkList L=(LinkList)malloc(sizeof(LNode));
printf("请依次输入单链表的数据(头插法):(键入“$”代表建立结束)\n");
L=CreateFromHead();
LinkList s=L->next;
printf("建立的单链表如下:\n");
while(s)
{printf("%c",s->data);
s=s->next;}
int temp=ListLength(L);
printf("\n单链表的长度为:%d\n",temp);
return 0;
}
最终发现是因为输入用的时getchar();每次读取只读入一个字符,输入时是按照a回车b回车来输入的,导致每次getchar()多读回车新建了一个链表的结点,所以长度扩大了一倍。
我的解决方法是在每次读取时增加一个读取条件,当输入的字符不为空格或回车时新建结点。