單鏈表這種數據結構表現爲:在內存中可以不連續存儲,每一個節點存儲一個指向下一個節點的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;
}
該程序在如下環境中編譯測試通過: