注册 登录
编程论坛 C++教室

关于链表的程序....

programmer7 发布于 2007-03-30 21:17, 913 次点击

我是个初学C++者,有很多不懂的,望大家指教..我有个链表程序,就是不知道怎么改才对
#include<iostream.h>
class Node{
friend class List;
private:
int date;
Node *next; //后继指针
};
class List{
Node *PList;
static int ElemCount; //ElemCount是元素个数-1
public:
List(); //柝构函数
~List();
int Build_IN(int i,int NodeElem); //从第i个元素插入NodeElem
void Display_HT(); //从头到尾显示链表元素
void Clear();
};

int List::ElemCount=0;

List::List(){PList=new Node;PList=0;} //1

int List::Build_IN(int i,int NodeElem) //2
{
if(i>ElemCount+1) //如果i大于元素个数-1,输出错误并返回
{
cout<<"ERROR!"<<endl;
return 0;
}
int j=0;
Node *Temp_List;
Temp_List->date=NodeElem; //赋值给date
while(PList==0&&j>i-2){PList=PList->next;j++;}
if(PList->next==0){
Temp_List=PList->next;
PList->next=0;
}
Temp_List->next=PList->next;
PList->next=Temp_List;
ElemCount++;
}

void List::Display_HT()
{
cout<<"Display from first one"<<endl;
for(int i=0;i<ElemCount;i++){
cout<<PList->date<<" ";
PList=PList->next;
}
cout<<endl;
}
List::~List()
{
Clear();
}

void List::Clear()
{
Node *Temp_Delete=PList;
if(Temp_Delete==0)
return;
while(Temp_Delete!=0)
{
Node *TEMP_Delete=Temp_Delete;
Temp_Delete=Temp_Delete->next;
delete TEMP_Delete;
}
}

void main()
{
List List1;
List1.Build_IN(1,6);
List1.Build_IN(1,8);
List1.Build_IN(2,7);
List1.Display_HT();
}
以上是我不明白的部分....
1.....PList=new Node这句有没必要???????
2.....这里是不是每次调用时PList都不同???????怎么才能每次调用该函数时PLsit都为同一个值,即PList指向地址1,之后PList变了,但是第二次调用该函数时,PList也是指向地址1...
3总之,怎么改才对,帮一下手.谢谢....

7 回复
#2
cpluslover2007-03-31 23:48

我研究了下你的程序,给你改了一点
因为不明白你要想怎么插入,就私自做决定加了个头结点,里面放-1,做哨兵用吧
看看试试吧

#include<iostream.h>
#include<stdlib.h>
class Node
{
friend class List;
private:
int date;
Node *next;
};

class List
{

Node *PList;
static int ElemCount; //y元素个数,我给加了个头结点包括头结点
public:
List(); //柝构函数
~List();
void Build_IN(int i,int NodeElem); //从第i个元素前还是后??按后处理吧插入NodeElem
void Display_HT(); //从头到尾显示链表元素
void Clear();
};

int List::ElemCount=1;//定义为1目的是把头结点-1也包含进去了

List::List()
{
PList=new Node;
PList->next=NULL;
PList->date=-1; //用-1表示它是头结点,当哨兵用吧。
} //1

void List::Build_IN(int i,int NodeElem) //2
{
Node* copy_PList=PList;
if(i>ElemCount||i<1) //用的后插法第i个元素后面,因为有头结点。
{
cout<<"ERROR!"<<endl;
exit(1);
}

int j=1;
Node *Temp_List=new Node;
Temp_List->date=NodeElem; //赋值给date

while(j<i)
{
copy_PList=copy_PList->next;
j++;
}

Temp_List->next=copy_PList->next;
copy_PList->next=Temp_List;
ElemCount++;

}

void List::Display_HT()
{

Node* copy_PList=PList;

if(!copy_PList) cout<<"have no Element!"<<endl;

cout<<"Display from first one"<<endl;
for(int i=0;i<ElemCount;i++)
{
cout<<copy_PList->date<<" ";
copy_PList=copy_PList->next;
}
cout<<endl;
}

List::~List()
{
Clear();
}

void List::Clear()
{
Node *Temp_Delete=PList;
while(!Temp_Delete)
{
Temp_Delete=Temp_Delete->next;
delete PList;
}
PList=NULL;
}

void main()
{
List List1;
List1.Build_IN(1,6);
List1.Build_IN(1,8);
List1.Build_IN(2,7);
List1.Display_HT();
}

#3
RL7202007-04-01 00:05
Answer:
1、肯定有必要。。。不建立一个头节点后面的节点连到哪? 不过不是=0吧。。。是NULL。。
2、什么意思??
3、参见2楼
#4
Arcticanimal2007-04-01 11:11
插入的新元素要用new
这样
Node *Temp_List;
Temp_List->date=NodeElem; //赋值给date
是不行的,Temp_List在Build_IN函数结束后就被删除,copy_PList->next就会指向一个错误的地址
#5
song42007-04-01 12:37
以下是引用cpluslover在2007-3-31 23:48:04的发言:

我研究了下你的程序,给你改了一点
因为不明白你要想怎么插入,就私自做决定加了个头结点,里面放-1,做哨兵用吧
看看试试吧

#include<iostream.h>
#include<stdlib.h>
class Node
{
friend class List;
private:
int date;
Node *next;
};

class List
{

Node *PList;
static int ElemCount; //y元素个数,我给加了个头结点包括头结点
public:
List(); //柝构函数
~List();
void Build_IN(int i,int NodeElem); //从第i个元素前还是后??按后处理吧插入NodeElem
void Display_HT(); //从头到尾显示链表元素
void Clear();
};

int List::ElemCount=1;//定义为1目的是把头结点-1也包含进去了

List::List()
{
PList=new Node;
PList->next=NULL;
PList->date=-1; //用-1表示它是头结点,当哨兵用吧。
} //1

void List::Build_IN(int i,int NodeElem) //2
{
Node* copy_PList=PList;
if(i>ElemCount||i<1) //用的后插法第i个元素后面,因为有头结点。
{
cout<<"ERROR!"<<endl;
exit(1);
}

int j=1;
Node *Temp_List=new Node;
Temp_List->date=NodeElem; //赋值给date

while(j<i)
{
copy_PList=copy_PList->next;
j++;
}

Temp_List->next=copy_PList->next;
copy_PList->next=Temp_List;
ElemCount++;

}

void List::Display_HT()
{

Node* copy_PList=PList;

if(!copy_PList) cout<<"have no Element!"<<endl;

cout<<"Display from first one"<<endl;
for(int i=0;i<ElemCount;i++)
{
cout<<copy_PList->date<<" ";
copy_PList=copy_PList->next;
}
cout<<endl;
}

List::~List()
{
Clear();
}

void List::Clear()
{
Node *Temp_Delete=PList;
while(!Temp_Delete)
{
Temp_Delete=Temp_Delete->next;
delete PList;
}
PList=NULL;
}

void main()
{
List List1;
List1.Build_IN(1,6);
List1.Build_IN(1,8);
List1.Build_IN(2,7);
List1.Display_HT();
}


希望有更多这样的人
态度可贵

#6
programmer72007-04-02 13:56

谢谢先...就像song4说的那样,有更多谨慎,细心,不厌其烦的人....如果我技术那样,我也想这样

1