線性表的鏈式表示和實現
單鏈表
struct Node
{
int data;
Node *next;
};
class LinkList
{
Node *head;
public:
LinkList(){ head = new Node; head->next = NULL; };
~LinkList(){ delete head; };
void Create(int n); //創建長度爲n的單鏈表
int GetElem(int i); //獲取第i個元素
int Locate(int e); //返回第一個與e匹配的元素位序
bool IsEmpty(){ return (head->next == NULL); }//判斷是否爲空表
int Prior(int e); //e的前驅
int Next(int e); //e的後續
void Insert(int x, int i); //將x插入到i位置
int Delete(int i); //刪除表中第i個元素
void Clear(); //清空
void Print(); //輸出
};
結構體Node用來表示鏈表的每一個元素分別是數據域和它的指針域;
取元素
int LinkList::GetElem(int i){
Node *p;
int k, j;
if (head->next == NULL)
{
cout << "表爲空" << endl;
exit(0);
}
else
{
p = head;
k = 0;
while (p && k<i)
{
p = p->next;
k++;
}
if (!p||k>i)
{
cout << "第" << i << "個元素不存在" << endl;
exit(0);
}
return(p->data);
}
}
時間複雜度O(n);
插入操作
void LinkList::Insert(int x, int i){
Node *p = head;
int k = 0;
while (p && k<i-1)
{
p = p->next;
k++;
}
if (!p||k>i-1)
{
cout << "第" << i - 1 << "個元素不存在" << endl;
exit(0);
}
Node *s = new Node;
if (!s)
{
cout << "空間分配失敗" << endl;
exit(0);
}
s->data = x;
s->next = p->next;
p->next = s;
}
刪除操作
int LinkList::Delete(int i){
Node *p = head;
int k = 0;
while (p&&k<i-1)
{
p = p->next;
k++;
}
if (!p||p->next==NULL)
{
cout << "刪除位置非法" << endl;
exit(0);
}
Node *q = p->next; //暫存刪除節點
p->next = q->next; //刪除
int e = q->data;
delete q;
return e;
}
建立單鏈表
void LinkList::Create(int n){
Node *p;
for (int i = 0; i < n; i++)
{
p = new Node;
cin >> p->data;
p->next = head->next;
head->next == p;
}
}
雙向鏈表
struct DNode
{
int data;
DNode *prior; //前驅指針
DNode *next; //後續指針
};
class DBList
{
DNode *head;
public:
DBList(){ head = new DNode; head->next = NULL; head->prior == NULL; };
~DBList();
void Create(int n); //創建長度爲n的雙鏈表
int GetElem(int i); //取表中第i個元素
DNode Locate(int e); //返回第一個與e匹配的節點指針
bool IsEmpty();
void Insert(int x, int i);
int Delete(int i);
void Clear();
};
在雙鏈表中,有些操作如取元素,求表長,定位等,只涉及一個方向的指針,則這些操作的算法描述和單鏈表相同。但在進行插入,刪除操作時有很大的不同,在雙鏈表中需同時修改兩個方向上的指針,還要小心修改順序。
雙鏈表的節點刪除操作
p -> prior -> next = p -> next;
if(!p->next)
p -> next -> prior = p -> prior;
雙鏈表的節點插入操作
s = new DNode;
s -> data = e;
s -> prior = p -> prior;
p -> prior = next = s;
p -> prior = s;
s -> next = p;