单链表头插法无法正常遍历和执行其他方法,但是尾插法可以
#include<iostream>
#include<stdio.h>
using namespace std;
typedef struct node{
int data;
struct node *next;
}LNode,*LinkList;
//单链表的创建———头插法 way 1
//头插法其实是在头节点L和L->next之间不断添加新的数据
LinkList CreateLinkListF(){
//创建空表和节点变量
LinkList L,p;
//数据域
int x;
L=new LNode;
if(L==NULL)
return NULL;
L->next=NULL;
cout<<"请输入数据直到0结束:";
cin>>x;
while(x!=0){
//申请新节点
p=new LNode;
p->data=x;
L->next=p;
p->next=L->next;
cin>>x;
}
return L;
}
// 单链表的创建———尾插法 way 2
LinkList CreateLinkListR(){
LinkList L,p,tail;
L=new LNode;
if(L==NULL)
return NULL;
L->next=NULL;
tail=L;
int x;
cout<<"请输入数据直到0结束:";
cin>>x;
while(x!=0){
p=new LNode;
p->data=x;
p->next=NULL;
tail->next=p;
tail=p;
cin>>x;
}
return L;
}
//求表长
int GetLength(LinkList L){
LinkList p=L;
//带头结点
/*
int j;
while(p->next){
p=p->next;
j++;
}
return j;
*/
//不带头结点
int j;
while(p){
p=p->next;
j++;
}
return j;
}
//按序号查找p->next=NULL,说明p是最后一个节点
LinkList Get_LinkList(LinkList L,int i){
LinkList p;
int j=0;
p=L;
while(p->next!=NULL&&i<j){
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
//按值查找
LinkList Search2(LinkList L,int x){
LinkList p;
p=L->next;
while(p){
if(p->data==x)
return p;
else
p=p->next;
}
return NULL;
}
//前插(在指定序号前)
int InsertBefor(LinkList L,int x,int i){
LinkList s,p;
p=Get_LinkList(L,i-1);
if(p==NULL){
cout<<"参数i错误!"<<endl;
return 0;
}else{
s=new LNode;
if(s==NULL){
cout<<"申请空间失败!"<<endl;
}
s->data=x;
s->next=p->next;
p->next=s;
}
}
//删除第i个节点
int DeleteLinkList(LinkList L,int i){
LinkList p,s;
p= Get_LinkList(L,i-1);
if(p==NULL){
cout<<"该节点不存在!"<<endl;
return 0;
}else{
s=p->next;
p->next=s->next;
delete s;
return 1;
}
}
//遍历链表
void show(LinkList L){
LinkList p;
p=L->next;
int i=0;
while(p!=NULL){
i++;
printf("第%d个节点数据为:%d\n",i,p->data);
p=p->next;
}
return;
}
int main(){
cout<<"尾插法建立单链表————";
LinkList L,p;
L=CreateLinkListR();
show(L);
cout<<"按值查找————";
cout<<"你要查找的值:";
int x;
cin>>x;
p=Search2(L,x);
cout<<p->data<<endl;
cout<<"头插法建立单链表————";
LinkList M;
M=CreateLinkListF();
show(M);
return 0;
}
头插法遍历会导致无线循环
怎么才能正确使用头插法遍历
LinkList CreateLinkListF()
{
//创建空表和节点变量
LinkList L, p;
//数据域
int x;
L = new LNode;
if (L == NULL)
return NULL;
L->next = NULL;
cout << "请输入数据直到0结束:";
cin >> x;
while (x != 0)
{
//申请新节点
p = new LNode;
p->data = x;
p->next = L->next; //
L->next = p; //
}
return L;
}