單鏈表概念及實現

         單鏈表這種數據結構表現爲:在內存中可以不連續存儲,每一個節點存儲一個指向下一個節點的next指針。單鏈表在search時以O(N)的時間運行,而在insert時以O(1)時間運行。

       在實現方面,以C爲例,一般會保留一個header作爲表頭,以NULL爲表尾,廢話不多說,上代碼。

 

接口定義如下:

 

#ifndef _List_H
 #define _List_H
  /*鏈表節點存儲的數據類型*/
  typedef int  ElementType;
  /*鏈表節點結構體*/
  struct NodeStruct;
  /*鏈表結構體*/
  struct ListStruct;
  /*鏈表節點結構體指針*/
  typedef struct NodeStruct *PtrToNode;
  /*鏈表結構體指針*/
  typedef struct ListStruct *PtrToList;
  /*鏈表節點*/
  typedef PtrToNode Node;
  /*鏈表*/
  typedef PtrToList List;
  struct NodeStruct{
      ElementType element;
      Node next;
  };
  struct ListStruct{
    Node header;
    int size;
  };
/*初始化一個鏈表*/
  List initList();
  /*添加元素,默認在header之後插入*/
  void add(List list,ElementType element);
  /*從header開始找到第一個存儲該值的節點*/
  Node find(List list,ElementType element);
  /*找到某個節點的上一個節點*/
  Node previous(List list,Node node);
  /*刪除存儲該值的第一個節點*/
  void removeElement(List list,ElementType element);
  /*銷燬鏈表*/
  void destoryList(List list);
  /*打印鏈表*/
  void printList(List list);
#endif

實現如下:

#include "linkedlist.h"
#include <stdio.h>
#include <stdlib.h>

List initList(){
   List list;
   Node header;
   header = malloc(sizeof(struct NodeStruct));
   if(header == NULL){
     printf("%s\n","OutOfMemoryError!");
     exit(1);
   }
   header->next = NULL;
   list = malloc(sizeof(struct ListStruct));
   if(list == NULL){
     printf("%s\n","OutOfMemoryError!");
     exit(1);
   }
   list->header = header;
   list->size = 0;
   return list;
}

void add(List list,ElementType element){
  if(list == NULL || list->header == NULL){
     printf("%s\n","please init list first!");
  }
  Node header,newNode,firstNode;
  header = list->header;
  firstNode = header->next;
  newNode = malloc(sizeof(struct NodeStruct));
  if(newNode == NULL){
    printf("%s\n","OutOfMemoryError!");
    exit(1);
  }
  newNode->next = firstNode;
  newNode->element = element;
  header->next = newNode;
  list->size++;
}

void printList(List list){
  if(list == NULL){
    printf("%s\n","list is null!");  
    return;  
  }
  printf("[");
  Node firstNode = list->header->next;
  while(firstNode != NULL){
     printf("%d,",firstNode->element);
     firstNode = firstNode->next;
  }
  if(list->size>0){
    printf("\b]\n");
  }else{
    printf("]\n");
  }
}

Node find(List list,ElementType element){
  Node header,firstNode,result;
  result = NULL;
  header = list->header;
  firstNode = header->next;
  while(firstNode != NULL){
    if(firstNode->element == element){
       result = firstNode;
       break;
    }else{
        firstNode = firstNode->next;
    }
  }
}

void removeElement(List list,ElementType element){
  Node previousNode,currentNode,nextNode;
  currentNode = find(list,element);
  if(currentNode == NULL)
     return;
  previousNode = previous(list,currentNode);
  nextNode = currentNode->next;
  previousNode->next = nextNode;
  free(currentNode);
  list->size--;
}

Node previous(List list,Node node){
  Node header,result;
  header = list->header;
  result = header;
  while(result->next != node){
      result = result->next;
  }
  return result;
}

void destoryList(List list){
  Node header,firstNode,nextNode;
  header = list->header;
  firstNode = header->next;
  header->next = NULL;
  while(firstNode!=NULL){
       nextNode = firstNode->next;
       free(firstNode);
       list->size--;
       firstNode = nextNode;
  }  
  free(header);
  header = NULL;
  free(list);
  list = NULL;
}

該程序在如下環境中編譯測試通過:

  



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