鏈表是指用一組任意的存儲單元來依次存放線性表的結點,這組存儲單元即可以是連續的,也可以是不連續的,甚至是零散分佈在內存中的任意位置上的。因此,鏈表中結點的邏輯次序和物理次序不一定相同。爲了能正確表示結點間的邏輯關係,在存儲每個結點值的同時,還必須存儲指示其後繼結點的地址(或位置)信息,這個信息稱爲指針(pointer)或鏈(link)。這兩部分組成了鏈表中的結點結構:
(1)存儲數據元素自身信息的部分,稱爲數據域;
(2)存儲與前驅或後繼結點的邏輯關係,稱爲指針域;
其中:data域是數據域,用來存放結點的值。next是指針域(亦稱鏈域),用來存放結點的直接後繼的地址(或位置)。鏈表正是通過每個結點的鏈域將線性表的n個結點按其邏輯次序鏈接在一起的。由於上述鏈表的每一個結只有一個鏈域,故將這種鏈表稱爲單鏈表(Single Linked)。
顯然,單鏈表中每個結點的存儲地址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指針head指向開始結點。同時,由於最後一個結點無後繼,故結點的指針域爲空,即NULL(圖示中常用^表示)。
#include<iostream>//單鏈表基本操作插入 刪除 增加 獲得長度 打印
using namespace std;
typedef int ElemType;
typedef struct lnode
{
int data;
lnode *next;//lnode 類的啊啊啊
}lnode;
class LinkList
{
private:
lnode *head;
int length = 0 ;
public:
void CreatList1(int n);//頭插法
void CreatList2(int n);//尾插法
void ListInsert(int i,int e);//插入i個位置某個數e
int ListDelete(int i);//刪掉第i個數
int GetElem(int i);//獲得第i個數
int LocateElem(int e);//獲得數e的地址
int Listlength();//獲得長度
void printList();//打印鏈表;
void reverse(lnode *& head);
};
void LinkList::CreatList1(int n)
{
lnode *p;
cout<<"輸入"<<n<<"個數據元素值"<<endl;
for(int i=0;i<n;i++)
{
p=new lnode;
cin>>p->data;
p->next=head->next;
head->next=p;
length++;
}
}
void LinkList::CreatList2(int n)
{
lnode *p,*s=head;
cout<<"輸入"<<n<<"個數據元素"<<endl;
for(int i=0;i<n;i++)
{
p=new lnode;
cin>>p->data;
p->next=NULL;
s->next=p;
s=p;
length++;
}
}
int LinkList::LocateElem(int e)
{
lnode *p=head->next;
int j=1;
while(p&&p->data!=e)
{
p=p->next;
j++;
}
if(p==NULL)
return 0;
else
return j;
}
int LinkList::GetElem(int i)
{
lnode *p=head->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return -1;
else
return p->data;
}
void LinkList::ListInsert(int i,int e)
{
int j=0;
lnode*p=head;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
cout<<"failure"<<endl;
return ;
}
else
{
lnode*s=new lnode;
s->data=e;
s->next=p->next;
p->next=s;
length++;
}
}
int LinkList::ListDelete(int i)
{
int j=0;
lnode*p=head;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
cout<<"fail to delete"<<endl;
return -1;
}
else
{
lnode*s=p->next;
p->next=s->next;
j=s->data;
delete s;
return j;
}
}
int LinkList::Listlength()
{
return length;
}
void LinkList::printList()
{
int i = length;
lnode* p = head;
while(i --)
{
p = p -> next;
cout<<p -> data <<" ";
}
}
void LinkList::reverse(lnode *& head)
{
lnode* p = head -> next;
if(!p || ! p -> next)
{
cout<<" wrong"<<endl;
return;
}
lnode * qr = p -> next, * q;
p ->next = NULL;
}
int main()
{
LinkList LinkLista;
LinkLista.CreatList1(5);
LinkLista.printList();
cout << "length:"<<LinkLista.Listlength()<<endl;
LinkLista.ListInsert(2,5);
LinkLista.printList();
return 0;
}