单链表头插法和尾插法的诡异结果!请朋友们帮忙看下.
运行结果:
----------------------------------------
尾插法建立单链表:
123$
->1->2->3
单链表结束!
单链表L的长度为:3
头插法建立单链表...
123$
->3->2->1->
单链表结束!
单链表s的长度为:4
-----------------------------------------
main函数中,CreatFromHead和CreatFromTail两行代码,不论谁放在后边,输出时总是有个换行,链表长度+1,找了一下午,实在找不到问题,所以请教各位朋友有空帮忙看一下!谢谢!
#include <iostream>using namespace std;/* 单链表的基本操作 */typedef char ElemType;typedef struct Node{ ElemType data; struct Node *next;}Node,*LinkList; //LinkList为结构类型指针//------建立单链表:头插法------LinkList CreatFromHead(){ cout<<"头插法建立单链表..."<<endl; LinkList L; Node *s; ElemType c; int flag=1; //设置一个标志变量flag,初值为1,当输入'$'时,将flag设置为0,建表结束 L = (Node *)malloc( sizeof(Node) ); //为头结点分配存储空间 L->next = NULL; while(flag) { c=getchar(); if(c != '$') { s = (Node *)malloc(sizeof(Node)); //为读入的字符分配存储空间 s->data=c; s->next=L->next; L->next=s; } else { flag = 0; //建表结束 } }//while return L;} //CreatFromHead//------建立单链表:尾插法------LinkList CreatFromTail(){ cout<<"尾插法建立单链表:"<<endl; int flag=1; ElemType c; Node *r,*s; LinkList L; L=(Node*)malloc(sizeof(Node)); //为头结点分配存储空间 L->next=NULL; r=L; //r始终动态指向链表的当前表尾,以便于做表尾插入,其初值指向头结点 while(flag) { c=getchar(); if(c!='$') { s = (Node*)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { flag = 0; r->next=NULL; } }//while return L;}//CreatFromTail//------单链表的遍历及输出------void Traverse(LinkList L){ Node *p = L->next; while(p != NULL) { cout<<"->"<<(p->data); p = p->next; }//while cout<<"\n单链表结束!\n";} //Traverse//------单链表的长度------int ListLength(LinkList L){ Node *p; p=L->next; int j=0; while(p != NULL) { p=p->next; j++; } return j;}//ListLengthint main(){ LinkList L=CreatFromTail(); //尾插法 Traverse(L); cout<<"单链表L的长度为:"<<ListLength(L)<<endl; LinkList s=CreatFromHead(); //头插法 Traverse(s); cout<<"单链表s的长度为:"<<ListLength(s)<<endl; return 0;}