//=============================================================
//鏈表具體函數實現部分
//=============================================================
#include "LinkList.h"
#include <malloc.h>
#include "stdafx.h"
void main()
{
//TODO:Just a main to avoid the error
}
//分配一個p指向的值爲e的節點,並返回OK;如果分配失敗,則error
Status MakeNode( Link &p, ElemType e){
p = ( Link)malloc(sizeof(LNode));
if( !p) return ERROR;
p->data = e;
p->next = NULL;
return OK;
}//The end of MakeNode
//釋放p指向的節點
Status FreeLNode( Link &p){
if( !p) return ERROR;//Space does not exist
free( &p);
return OK;
}//end of FreeLNode
//初始化一個已經聲明鏈表L
Status InitList( LinkList &L){
L.head = L.tail = NULL;
L.len = 0;
return OK;
}
//銷燬一個鏈表L
Status DestroyList( LinkList &L){
if( L.len != 0){//if the link list is not empty
Link p = L.head, q = NULL;
for( ; L.len >=0 && p->next != NULL; --L.len){
q = p->next;
L.head = q;
free( &p);
p = q;
}
L.head = L.tail = NULL;
L.len = 0;
free( &p);
free( p);
free( q);
free( &L);
}//end of if
else{//if the link list is empty
L.head = L.tail = NULL;
L.len = 0;
free( &L);
}
return OK;
}//end of DestroyList
//將當前鏈表L清空,變成一個初始狀態的鏈表
Status ClearList( LinkList &L){
if( L.len != 0){//if the link list is not empty
Link p = L.head, q = NULL;
for( ; L.len >=0 && p->next != NULL; --L.len){
q = p->next;
L.head = q;
free( &p);
p = q;
}
L.head = L.tail = NULL;
L.len = 0;
free( &p);
free( p);
free( q);
}//end of if
else{//if the link list is empty
L.head = L.tail = NULL;
L.len = 0;
}//end of else
return OK;
}
//在頭節點位置插入一個新的節點,h指向頭,s指向新的節點
Status InsFirst( LinkList &L, Link s){
if( !s) return ERROR;
s->next = L.head;
L.head = s;
return OK;
}
//將頭節點刪除
Status DelFirst( LinkList &L, Link &q){
if( !L.head) return ERROR;
q = L.head;
L.head = q->next;
return OK;
}
//向鏈表內插入數據,s以後的一個或若干個節點插入鏈表的尾部
//並修改鏈表的tail指針
Status Append( LinkList &L, Link s){
if( !s) return ERROR;//no node at s
L.tail->next = s;
while( s->next){//find the new end at the end of list pointed by s
s = s->next;
}
L.tail = s;
return OK;
}
//刪除鏈表尾節點元素,由q返回
Status Remove( LinkList &L, Link &q){
if( L.len == 0) return ERROR;//the list is empty
Link p = L.head;//a temp pointer used to find the
//node before the tail
while( p->next != L.tail)
p = p->next;//till find the node before the tail
q = p->next;
L.tail = p;
return OK;
}//end of Remove
//將元素插入由p指定的位置的前一個位置,並修改p指向新的節點
Status InsBefore( LinkList &L, Link &p, Link s){
Link q = L.head;//臨時指針遊標,輔助搜尋指向p的前一個節點
while( q->next != p)
q = q->next;
//一下三步將s的node插入p的前一個位置,即q的位置
s->next = p;
q->next = s;
p = s;
return OK;
}//end of InsBefore
//將元素插入由p指定位置的下一個位置,並修改p指向新節點
Status InsAfter( LinkList &L, Link &p, Link s){
if( !s) return ERROR;//節點指針s無效
//插入節點s
s->next = p->next;
p->next = s;
p = s;
return OK;
}//end of InsAfter
//修改當前指針p指向的元素的數據域的值爲e
Status SetCurElm( Link &p, ElemType e){
if( !p) return ERROR;//當前p指針無效
p->data = e;
return OK;
}//end of SetCurElm
//獲取當前指針p指向的元素的數據域的值,以e返回
Status GetCurElm( Link &p, ElemType &e){
if( !p) return ERROR;//當前指針p無效
e = p->data;
return OK;
}//end of GetCurElm
//判斷當前鏈表是否空表,以true和false返回結果
Status IsEmpty( LinkList L){
if( L.len == 0) return TRUE;//如果空,則鏈表長度爲0
else return FALSE;
}//end of IsEmpty
//返回鏈表當中頭節點的位置
Position Get_L_Head( LinkList L){
return L.head;
}
//返回鏈表當中最後一個節點的位置
Position GetLast( LinkList L){
return L.tail;
}
//由當前p指向的位置,查找p的鄰接前一個節點的位置
Position PriorPos( LinkList L, Link p){
Link q = L.head;//聲明一個臨時的指針,用於遍歷並定位於p的前軀
while( q->next != p)
q = q->next;
return q;
}
//由當前p指向的位置,查找p的下一個鄰接元素的位置
Position NextPos( Link p){
return p->next;
}
//獲取當前鏈表內第i個元素的位置,如果i不存在,則ERROR
Status LocatePos( LinkList L, Link &p, int i){
p = L.head;
int k = 1;//鏈表的位置是從1開始計算
while( p->next != NULL || k <= i){
p = p->next;
++k;
}
if( p->next == NULL && k < i) return ERROR;//如果計數器未及制定位置
//卻已經到了尾部,則不存在指定節點
else return OK;
}
//查找當前鏈表當中與給定內容e相符的第一個元素的位置,找不到則返回Error
Status LocateElem( LinkList L, ElemType e, Status ( *compare)( ElemType ,ElemType)){
return 0;//需要比較函數,不寫了~~
}
//遍歷整個鏈表,如果遍歷失敗,則返回falsh
Status ListTraverse( LinkList L, Status (*Visit)(LinkList)){
return 0;//需要遍歷函數,不寫了~~~
}