C 實現雙鏈表
阿新 • • 發佈:2018-12-09
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;
}