DoublyLinkedList.h
#pragma once
extern int DLink_Create();
extern int DLink_Size();
extern void* DLink_GetValue(int index);
extern int DLink_InsertFirst(void *pval);
extern int DLink_InsertLast(void *pval);
extern int DLink_Insert(int index, void *pval);
extern int DLink_DeleteFirst();
extern int DLink_DeleteLast();
extern int DLink_Delete(int index);
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;
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;
}
int DLink_Create()
{
phead = CreateNode(NULL);
if (phead == NULL)
return -1;
count = 0;
return 0;
}
int DLink_Size()
{
return count;
}
static node* GetNode(int index)
{
if (index < 0 || index >= count)
{
printf("%s failed! Index is out of range!\n", __func__);
return NULL;
}
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;
}
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;
}
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);
}
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;
}
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
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"},
};
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;
}
测试结果
参考:http://wangkuiwu.github.io/2013/01/01/dlink/