1. 程式人生 > >C 實現雙鏈表

C 實現雙鏈表

DoublyLinkedList.h

#pragma once

// 新建雙向連結串列。成功,返回0;否則,返回-1。
extern int DLink_Create();

// 連結串列大小
extern int DLink_Size();

// 獲取第index位置的節點的值。
extern void* DLink_GetValue(int index);

// 表頭插入資料
extern int DLink_InsertFirst(void *pval);

// 表尾插入資料
extern int DLink_InsertLast(void *pval);

// 在第index位置插入資料
extern
int DLink_Insert(int index, void *pval); // 刪除雙鏈表的第一個節點 extern int DLink_DeleteFirst(); // 刪除雙鏈表的最後一個節點 extern int DLink_DeleteLast(); // 刪除雙鏈表的第index個節點 extern int DLink_Delete(int index); // 銷燬雙向連結串列。成功,返回0;否則,返回-1。 extern int DLink_Destory();

DoublyLinkedList.c

#include <stdio.h>
#include
<malloc.h> // 雙向連結串列節點 typedef struct node { struct node *prev; struct node *next; void *p; }node; // 頭結點,頭結點不儲存資料 static node *phead = NULL; // 節點個數 static int count = 0; // 新建節點。成功,返回節點指標;否則,返回NULL。 static node* CreateNode(void *pval) { node *pnode = NULL; pnode = (node*)malloc(sizeof(node)); if
(pnode == NULL) { printf("Create Node Failed!\n"); return NULL; } // 初始化新建節點前置節點和後置節點都是自己 pnode->prev = pnode->next = pnode; // 節點的值可為任何型別 pnode->p = pval; return pnode; } // 新建雙向連結串列。成功,返回0;否則,返回-1。 int DLink_Create() { // 建立表頭 phead = CreateNode(NULL); if (phead == NULL) return -1; count = 0; return 0; } // 連結串列大小 int DLink_Size() { return count; } // 獲取第index位置的節點。 0 <= index < count static node* GetNode(int index) { if (index < 0 || index >= count) { printf("%s failed! Index is out of range!\n", __func__); return NULL; } /// count = 6 /// ↓—————————————————————————————————————————————————↑ /// □□□ <-> □□□ <-> □□□ <-> □□□ <-> □□□ <-> □□□ <-> □□□ /// ↓—————————————————————————————————————————————————↑ /// head 0 1 2 3 4 5 // 正向查詢 if(index < (count/2)) { int i = 0; node *pnode = phead->next; while ((i++) < index) pnode = pnode->next; return pnode; } // 反向查詢 int i = count - 1; node *pnode = phead->prev; while ((i--) > index) pnode = pnode->prev; return pnode; } // 獲取第index位置的節點的值。 void* DLink_GetValue(int index) { node *pnode = GetNode(index); if (pnode == NULL) { printf("%s failed!\n", __func__); return NULL; } return pnode->p; } // 表頭插入資料 int DLink_InsertFirst(void *pval) { node *pnode = CreateNode(pval); if (pnode == NULL) return -1; pnode->next = phead->next; pnode->prev = phead; phead->next->prev = pnode; phead->next = pnode; count++; return 0; } // 表尾插入資料 int DLink_InsertLast(void *pval) { node *pnode = CreateNode(pval); if (pnode == NULL) return -1; pnode->next = phead; pnode->prev = phead->prev; phead->prev->next = pnode; phead->prev = pnode; count++; return 0; } // 在第index位置插入資料 int DLink_Insert(int index, void *pval) { if (index == 0) return DLink_InsertFirst(pval); node *pIndex = GetNode(index); if (pIndex == NULL) return -1; node *pnode = CreateNode(pval); if (pnode == NULL) return -1; pnode->next = pIndex->next; pnode->prev = pIndex; pIndex->next->prev = pnode; pIndex->next = pnode; count++; return 0; } // 刪除雙鏈表的第一個節點 int DLink_DeleteFirst() { return DLink_Delete(0); } // 刪除雙鏈表的最後一個節點 int DLink_DeleteLast() { return DLink_Delete(count - 1); } // 刪除雙鏈表的第index個節點 int DLink_Delete(int index) { node *pindex = GetNode(index); if (pindex == NULL) { printf("%s failed!", __func__); return -1; } pindex->next->prev = pindex->prev; pindex->prev->next = pindex->next; free(pindex); count--; return 0; } // 銷燬雙向連結串列。成功,返回0;否則,返回-1。 int DLink_Destory() { if (phead == NULL) { printf("%s failed!\n", __func__); return -1; } node *pnode = phead->next; node *ptmp = NULL; while (pnode != phead) { ptmp = pnode; pnode = pnode->next; free(ptmp); } free(phead); phead = NULL; count = 0; return 0; }

DoublyLinkedList_Test.c

#include <stdio.h>
#include <DoublyLinkedList.h>

void int_test()
{
    int iarr[4] = { 10, 20, 30, 40 };
    printf("\n----%s----\n", __func__);
    DLink_Create();             // 建立雙鏈表

    DLink_Insert(0, &iarr[0]);  // 在表頭插入資料
    DLink_Insert(0, &iarr[1]);  // 在表頭插入資料
    DLink_Insert(0, &iarr[2]);  // 在表頭插入資料
    DLink_Insert(0, &iarr[3]);  // 在表頭插入資料

    printf("This list`s size is %d\n", DLink_Size());

    // 列印全部資料
    int *p;
    int size = DLink_Size();
    for (int i = 0; i < size; i++)
    {
        p = (int*)DLink_GetValue(i);
        printf("第%d個元素為:%d\n", i, *p);
    }
    DLink_Destory();
}

void string_test()
{
    char* sarr[4] = { "ten","tweny","thiry", "forty" };
    printf("\n----%s----\n", __func__);
    DLink_Create();

    DLink_Insert(0, sarr[0]);
    DLink_Insert(0, sarr[1]);
    DLink_Insert(0, sarr[2]);
    DLink_Insert(0, sarr[3]);

    printf("This list`s size is %d\n", DLink_Size());

    char *p;
    int size = DLink_Size();
    for (int i = 0; i < size; i++)
    {
        p = (char*)DLink_GetValue(i);
        printf("第%d個元素為:%s\n", i, p);
    }
    DLink_Destory();
}

typedef struct stu
{
    int id;
    char name[20];
}stu;

static stu arr_stu[] =
{
    {10,"andy"},
    {20,"baby"},
    {30,"city"},
    {40,"dog"},
};

#define ARR_STU_SIZE ((sizeof(arrstu))/(sizeof(arrstu[0])))

void object_test()
{
    printf("\n----%s----\n", __func__);
    DLink_Create();

    DLink_Insert(0, &arr_stu[0]);
    DLink_Insert(0, &arr_stu[1]);
    DLink_Insert(0, &arr_stu[2]);
    DLink_Insert(0, &arr_stu[3]);

    printf("This list`s size is %d\n", DLink_Size());

    stu *p;
    int size = DLink_Size();
    for (int i=0;i<size;i++)
    {
        p = (stu*)DLink_GetValue(i);
        printf("第%d個元素是[%d,%s]\n", i, p->id, p->name);
    }
    DLink_Destory();
}

int main()
{
    int_test();
    string_test();
    object_test();
    printf("\n");
    system("pause");
    return 0;
}

測試結果

這裡寫圖片描述