算法精解----3、单链表
生活随笔
收集整理的這篇文章主要介紹了
算法精解----3、单链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、鏈表需要動態開辟存儲空間,鏈表元素連接在一起,但在內存空間中它們是分散開的。
2、單鏈表只能以一個方向進行遍歷
3、釋放的是data指向的內存,而不是分配給指針變量data本身的內存空間
int *data; data = (int*)malloc(sizeof(int)); free(data);4、single_list.h
#ifndef LIST_H #define LIST_H//鏈表單個節點信息 typedef struct _ListElmt {void *data;//data指向另一個空間數據,刪除鏈表需要://1)釋放另外空間數據free(data);2)釋放單個鏈表節點struct _ListElmt *next; }ListElmt;//鏈表整體屬性 typedef struct _List {int size;int (*match)(const void *key1, const void *key2);void (*destroy)(void *data);ListElmt *head;ListElmt *tail; }List; #define list_size(list) (list->size) #define list_head(list) (list->head) #define list_tail(list) (list->tail) #define list_next(element) (element->next) #define list_data(element) (element->data)#define is_head(list,element) ((element == list->head) ? 1 :0) #define is_tail(element) ((element->next == NULL) ? 1 :0)void list_init(List *list, int size, void (*destroy)(void *data)); int list_ins_next(List *list, ListElmt *element, void *data); int list_rem_next(List *list, ListElmt *element); #endif5、single_list.c
#include <stdio.h> #include <stdlib.h> #include "single_list.h"//初始化,此時鏈表為空 void list_init(List *list, int size, void (*destroy)(void *data)) {list->size = size;list->destroy = destroy;list->head = NULL;list->tail = NULL;return; } //在element后面插入新節點 ,如果 element為空表示向頭結點前面插入 int list_ins_next(List *list, ListElmt *element, void *data) {ListElmt *new_element;if(( new_element = (ListElmt *)malloc(sizeof(ListElmt)) ) == NULL){return -1;}new_element->data = (void *)data;//如果 element為空表示向頭結點前面插入if(element == NULL){//如果鏈表中還沒有節點,則首尾節點都是新節點 if(list->size==0)list->tail=new_element; new_element->next = list->head;list->head = new_element; }else{//如果新節點插入的是鏈表末端 if(element->next==NULL)list->tail=new_element; new_element->next = element->next;element->next = new_element;}list->size++;return 0; } //刪除element后面的節點,如果element為空則刪除頭結點 //data保存刪除的節點中數據的地址,該地址是指向具體數據塊的data變量的地址 int list_rem_next(List *list, ListElmt *element, void **data) {ListElmt *old_element;if(list->size == 0){return -1;}if(element == NULL){*data = list->head->data; old_element = list->head;list->head = list->head->next;if(list->size==1)list->tail=NULL;}else{//如果element后面無節點可刪除,報錯 if(element->next == NULL)return -1;*data = element->next->data;old_element = element->next; element->next = element->next->next ;//刪除 element后面的節點,element可能為最末端的節點 if(element->next == NULL)list->tail = element;}list->size--;free(old_element);return 0; }void list_destroy(List *list) {void *data;while(list->size>0){if(list_rem_next(list, NULL, (void **)&data)==0 && list->destroy != NULL){//不僅要刪除鏈表節點還要 刪除該節點data指向的數據塊 list->destroy(data);}} }總結
以上是生活随笔為你收集整理的算法精解----3、单链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库:mysql 获取刚插入行id[转
- 下一篇: android dialog 点击确定不