如何设置头结点以及头结点的好处
在链表的建立时,如果使用头结点,可以使第一个结点在的操作一般化,也就是第一个结点和后面的结点的操作方法一样,
假如不建立头结点,那在链表的第一个节点前插入一个结点或者删除第一个结点的操作要麻烦一些。
首先,我们在链表建立时,都有NodePointer p=head这个来初始化第一个结点
在第一个位置插入元素时
我们一般是用s->next=p->next; p->next=s; 这样s就插入到了p的后面,但是假如没有设置头结点,我们插入的位置恰好也是第一个元素之前,那么再这样,就会出现s->next=head->next的情况,这样错了,因为head本来就是指向第一个节点的,假如我们再把head的后继赋值给s的后继,那么就相当于把原链表中的第二结点变成了结点s的后继,那s就成了第二个结点,显然不行。这样,假如我们不设头结点,就要分i等不等于1分情况了,比较麻烦。
But假如我们设置头结点过后,那么当插入是第一个元素之前时, 因为这时head指向的是头结点,所以s->next=head->next;就相当于把头结点的后继(也就是第一个原来表的第一个结点)赋值给s的后继,这样,s就成为了第一个结点,bingo!
至于设头结点的方法就是在链表的Linklist的构造函数中去写
LinkList(){
head=new LinkNode; //创建一个头结点,用头指针指向它
head->next=NULL; //最初时头结点的指针域为NULL
}
下面就是一个关于设有头结点的单链表的插入,删除等操作
#include<iostream>
using namespace std;
class LinkNode{
public:
int data;
LinkNode*next;
};
class LinkList{
public:
typedef LinkNode*NodePointer;
LinkList(){
head=new LinkNode;
head->next=NULL;
}
~LinkList(){
NodePointer p,q;
p=head->next;
while(p){
q=p->next;
free(p);
p=q;
}
head->next=NULL;
}
bool insert(int i,int e){
int j=1;
NodePointer p=head;
NodePointer s;
while(p &&j<i){
++j;
p=p->next;
}
if(!p||j>i)
return false;
s=new LinkNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
void ListPrint(){
NodePointer p;
p=head;
cout<<"The linkList is: ";
while(p->next!=NULL){
p=p-> next;
cout<<p->data<<" ";
};
}
int getElem(int i,int&e){
int j;
NodePointer p;
p=head;
p=p->next;
j=1;
while(p&&j<i){
p=p->next;
++j;
}
e=p->data;
return 0;
}
bool deleteElem(int i,int &e){
int j;
NodePointer p,q;
p=head;
//p=p->next;
j=1;
while(p->next&&j<i){
p=p->next;
++j;
}
if(!(p->next))
return false;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return true;
}
int getLength(int& e){
int n=0;
NodePointer p=head->next;
while(p){
p=p->next;
++n;
}
e=n;
return n;
}
protected:
NodePointer head;
};
int main(){
LinkList d;
d.insert(1,2);
d.insert(2,3);
d.insert(3,3);
d.ListPrint();
int re;
int ba;
int e;
d.insert(1,5);
cout<<endl<<"在第一个结点前插入一个元素5 "<<endl;
d.ListPrint();
d.getElem(2,re);
cout<<endl<<"查找的第二个元素,取得的元素值="<<re<<endl;
d.ListPrint();
d.deleteElem(1,ba);
cout<<endl<<"删除的第一个元素,元素值="<<ba<<endl;
d.ListPrint();
d.getLength(e);
cout<<"一共有"<<e<<"个结点";
return 0;
}
好累啊,我的软件路。。。。