#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//单链表结构
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *head,*p;//指针类型说明
/*头插法建表
用头插法建成的链表中结点的次序和输入的顺序是相反的。
*/
linklist *CREATLISTF(){
char ch;//逐个输入字符,以'#'为结束符,返回单链表头指针
linklist * head,*s;
head=NULL;//链表开始为空
ch=getchar();//读入第一个结点的值
while(ch!='#')
{
s=malloc(sizeof(linklist));//生成新的结点
s->data=ch;
s->next=head;
head=s;//将新结点插入到表头上
ch=getchar();//读入下一个结点的值
}
return head;//返回表头指针
}
//计算不带头结点的单链表的长度,然后输出单链表
void Print(linklist *L)
{
int num=0;
linklist *p;
p=L;
while(p)
{
printf("%c ",p->data);
p=p->next;
num++;
}
printf("\nthe length is :%d\n",num);
}
//尾插法——返回表的头指针
linklist *CREATLISTR(){
char ch;
linklist * head,*s,*r;
head=NULL;//置空链表
r=NULL;//尾指针初值为空。
ch=getchar();
while(ch!='#'){
s=malloc(sizeof(linklist));//生成新的结点
s->data=ch;
if (head==NULL)
head=s;
else
r->next=s;
r=s;
ch=getchar();
}
if(r!=NULL)
r->next=NULL;
return head;
}
//查找——按照序号查找
//主函数
int main(){
linklist *f,*r ;
//printf("head insert:\n");
//f=CREATLISTF();//头插法建立单链表
//Print(f);//打印链表和链表的长度
printf("tail insert:\n");
r=CREATLISTR();//尾插法
Print(r);
}
=============调用头插法和尾插法,右边是输出结果============================
==============只是调用尾插法,右边是输出结果==============================
在主函数中先是调用头插法再调用尾插法。但是尾插法输出的长度多了一个。如果只是在调用尾插法,长度就正常输出了。这到底是什么原因??