C语言数据结构单链表,该怎么处理

C语言数据结构单链表
#include <stdio.h>
#include <malloc.h>

typedef int datatype;
typedef struct node
{
datatype data;
struct node*next;
}linklist;

void main()
{
linklist *p1,*p2,*p3;
void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表
declare();
while(1)
{
int i ;
printf("请选择:\n");
scanf("%d",&i);
switch(i)
{
case 1:p1=creatlist1();break;
case 2:printLinklist(p3);break;
}
}


}

void declare()
{
printf("1->前插法建立链表\n");
printf("2->打印链表\n");

}

linklist *creatlist3()
{
printf("---------------带头结点的尾插法建立链表开始-------------\n");
linklist *s,*head,*r;
char ch;
head =(linklist *)malloc(sizeof(linklist));
r=head;
printf("请输入链表节点(‘?’结束输入)\n");
ch=getchar();
while(ch!='?')
{
s=(linklist *)malloc(sizeof(linklist));
s->data=ch;
r->next=s;
r=s;
ch=getchar();
}
r->next=NULL;
printf("---------------带头结点的尾插法建立链表结束-------------\n");
return head;

}


void printLinklist(linklist * head)
{
linklist * p = head->next;
printf("链表为:");
int i =0;
while(p!=NULL)//为什么链表为abc,循环次数为6次
{

printf("%c\n",(char)p->data);
p=p->next;
i++;



}
printf("循环次数:%d",i);
}
这是我的程序,为什么打印链表的循环次数不是所打印链表的个数,例如我的链表有a,b,c三个元素,打印是的循环次数为6

------解决方案--------------------
这样就可以了
C/C++ code

#include <stdio.h>
#include <malloc.h>

typedef int datatype;
typedef struct node
{
    datatype data;
    struct node* next;
}linklist;

void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表

void main()
{
    linklist *p1;
    declare();
    while(1)
    {
        int i ;
        printf("请选择:\n");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            p1=creatlist3();
            break;
        case 2:
            printLinklist(p1);
            break;
        }
    }
}

void declare()
{
    printf("1->前插法建立链表\n");
    printf("2->打印链表\n");
}

linklist *creatlist3()
{
    printf("---------------带头结点的尾插法建立链表开始-------------\n");
    linklist *s,*head,*r;
    char ch;
    head =(linklist *)malloc(sizeof(linklist));
    r=head;
    printf("请输入链表节点(‘?’结束输入)\n");
    ch=getchar();
    while(ch!='?')
    {
        if(ch != '\n')
        {
            s=(linklist *)malloc(sizeof(linklist));
            s->data=ch;
            r->next=s;
            r=s;
        }
        ch=getchar();
    }
    r->next=NULL;
    printf("---------------带头结点的尾插法建立链表结束-------------\n");
    return head;
}


void printLinklist(linklist * head)
{
    linklist * p = head->next;
    printf("链表为:");
    int i =0;
    while(p!=NULL)//为什么链表为abc,循环次数为6次
    {
        printf("%c\n",(char)p->data);
        p=p->next;
        i++;
    }
    printf("循环次数:%d",i);
}

------解决方案--------------------
二楼代码完全可以,不过楼主应该理解你程序出问题的原因:在你每次按键盘输入时,送进缓冲区的除了你输入的字符外,还有个回车字符,所以ch每次读完你输入的字符外,下载循环会将回车符输入,这样看似只有一次读取字符,其实读了两次,一次你输入的字符,一次回车符,楼主程序出错的原因就是没有把这个回车符去掉。这样改就可以了:

#include <stdio.h>
#include <malloc.h>

typedef int datatype;
typedef struct node
{
datatype data;
struct node * next;
}linklist;

void main()
{
linklist *p1,*p2,*p3;
void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表