單鏈表的實現
#include<iostream.h>
struct Node
{ int data;
Node *next;
};
class LinkList
{
public:
LinkList( ){};
LinkList(int a[ ], int n);//建立有n個元素的單鏈表
void PrintList( ) ; //遍曆單鏈表,按序號依次輸出各元素
int Get(int i) ;//查詢元素值x
int Locate(int x);//查詢元素位置i
void Insert(int i, int x);//插入
int Delete(int i);//刪除
int Length( );//長度
private:
Node *first; //單鏈表的頭指標
};
LinkList::LinkList(int a[ ], int n)//建立有n個元素的單鏈表
{
first=new Node; //產生頭結點
Node *r,*s;
r=first; //尾指標初始化
for (int i=0; i<n; i++)
{
s=new Node; s->data=a[i]; //為每個數組元素建立一個結點
r->next=s; r=s; } //插入到終端結點之後
r->next=NULL; //單鏈表建立完畢,將終端結點的指標域置空
}
void LinkList::PrintList( )
{
Node *p;
p=first->next;
while (p)
{
cout<<p->data<<endl;
p=p->next;
}
}
int LinkList::Get(int i)
{
Node *p; int j;
p=first->next; j=1; //或p=first; j=0;
while (p && j<i)
{
p=p->next; //工作指標p後移
j++;
}
if (!p) throw "位置";
else return p->data;
}
int LinkList::Locate(int x)
{
Node *p; int j;
p=first->next; j=1;
if(p&&p->next){
while(p->data!=x)
{
p=p->next;
j++;
}
return j;
}
else throw "位置";
}
void LinkList::Insert(int i, int x)
{
Node *p; int j;
p=first ; j=0; //工作指標p初始化
while (p && j<i-1)
{
p=p->next; //工作指標p後移
j++;
}
if (!p) throw "位置";
else {
Node *s;
s=new Node;
s->data=x; //向記憶體申請一個結點s,其資料域為x
s->next=p->next; //將結點s插入到結點p之後
p->next=s;
}
cout<<x<<endl;
}
int LinkList::Delete(int i)
{
Node *p; int j;
p=first ; j=0; //工作指標p初始化
while (p && j<i-1) //尋找第i-1個結點
{
p=p->next;
j++;
}
if (!p || !p->next) throw "位置"; //結點p不存在或結點p的後繼結點不存在
else {
Node *q; int x;
q=p->next; x=q->data; //暫存被刪結點
p->next=q->next; //摘鏈
delete q;
return x;
}
cout<<i<<endl;
}
int LinkList::Length( )
{
Node *p = first->next;
int i = 0;
while(p)
{
p = p->next;
i++;
}
return i;
}
void main( )
{
int b[ ]={1,2,3,4,5};
LinkList a(b,5);
cout<<"單鏈表a的元素為:"<<endl;
a.PrintList(); //顯示鏈表中所有元素
cout<<"按位尋找第二個元素:"<<endl;
cout<<"第二個元素為:";
cout<<a.Get(2)<<endl; //尋找鏈表中第二個元素
cout<<endl;
cout<<"按值尋找5"<<endl;
cout<<"值為5的元素位置為:";
cout<<a.Locate(5)<<endl; //尋找元素5,並返回在單鏈表中位置
cout<<endl;
cout<<"插入的數為:"<<endl;
a.Insert(3,9);
cout<<"執行插入操作後單鏈表a為:"<<endl;
a.PrintList(); //輸出單鏈表b所有元素
cout<<"刪除第"<<
a.Delete(4);
cout<<"個數"<<endl;
cout<<"執行刪除操作後單鏈表a為:"<<endl;
a.PrintList();
cout<<endl;
cout<<"最後單鏈表a的長度為:";
cout<<a.Length()<<endl;
}