1. 程式人生 > >C語言實現單鏈表演算法

C語言實現單鏈表演算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct slist_node_s
{
    struct slist_node_s* next;
}slist_node_t;


struct slist_s
{
    slist_node_t* head;
    slist_node_t* tail;
    int count;
};
typedef struct slist_s slist_t;


slist_t*
slist_new()
{
    slist_t* node = NULL;
    node = (slist_t*)malloc
(sizeof(slist_t)); if (node) { memset(node, 0, sizeof(slist_t)); } return node; } void slist_free(slist_t* node) { if (node) { free(node); } return; } void* slist_add_head(slist_t* slist, slist_node_t* node) { if (!slist || !node) { return
NULL; } if (slist->head == NULL) { slist->tail = node; } else { node->next = slist->head; } slist->head = node; slist->count++; return node; } void* slist_add_tail(slist_t* slist, slist_node_t* node) { if (!slist || !node) { return
NULL; } if (slist->head == NULL) { slist->head = node; } else { slist->tail->next = node; } slist->tail = node; slist->tail->next = NULL; slist->count++; return node; } void slist_del_node(slist_t* slist, slist_node_t* del_node) { slist_node_t* node; slist_node_t* node_prev; slist_node_t* node_next; if (!slist || !del_node) { return; } for(node = slist->head; node; node_prev = node, node = node_next) { node_next = node->next; if (node == del_node) { if (del_node == slist->head) { slist->head = node_next; if (!node_next) { slist->tail = NULL; } } else { node_prev->next = node_next; if (!node_next) { slist->tail = node_prev; } } slist->count--; break; } } return; } struct my_data_s { slist_node_t head; int num; }; typedef struct my_data_s my_data_t; #define ENTRY_NUM 100 int main() { int ii = 0; my_data_t* my_data = NULL; slist_t* slist = NULL; slist_node_t* node; my_data_t* temp = NULL; slist = slist_new(); if (!slist) { return -1; } my_data = (my_data_t*)malloc(ENTRY_NUM * sizeof(my_data_t)); if (!my_data) { return -1; } memset(my_data, 0 ,sizeof(my_data_t)); for (ii = 0; ii < ENTRY_NUM; ii++) { my_data[ii].num = ii; slist_add_tail(slist, &(my_data[ii].head)); } slist_del_node(slist, &(my_data[50].head)); ii = 1; for (node = slist->head; node; node = node->next) { temp = (my_data_t*)node; printf("%.2d ", temp->num); if (ii%4 == 0) { printf("\n"); } ii++; } for (node = slist->head; node; node = node->next) { slist_del_node(slist, node); } slist_free(slist); free(my_data); return 0; }