DataStructure---LinkList 鏈表C語言實現代碼

//=============================================================
//鏈表具體函數實現部分
//=============================================================
#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;//需要遍歷函數,不寫了~~~
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章