双向链表示意图如下:
下面是双向链表的头文件:
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include "stdio.h"
#include "stdlib.h"
typedef void LinkList;
typedef struct LinkListNode
{
struct LinkListNode * next;
struct LinkListNode * pre;
}LinkListNode;
LinkList * LinkList_Create();
void LinkList_Destroy(LinkList * list);
void LinkList_Clear(LinkList * list);
int LinkList_Length(LinkList * list);
int LinkList_Insert(LinkList * list, LinkListNode *node, int pos);
LinkList * LinkList_Get(LinkList *list, int pos);
LinkList * LinkList_Delete(LinkList * list, int pos);
LinkList * LinkList_GetPre(LinkList *list, int pos);
LinkList * LinkList_GetNext(LinkList *list, int pos);
#endif
然后是双向链表的函数实现:
#include "linklist.h"
typedef struct TLinkList
{
LinkListNode header;
LinkListNode *slider;
int length;
}TLinkList;
LinkList * LinkList_Create()
{
TLinkList *list = NULL;
list = (TLinkList *)malloc(sizeof(TLinkList));
if (list == NULL)
{
return NULL;
}
list->header.next = NULL;
list->header.pre = NULL;
list->length = 0;
list->slider = NULL;
return list;
}
void LinkList_Destroy(LinkList * list)
{
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist != NULL)
{
free(tlist);
}
return;
}
void LinkList_Clear(LinkList * list)
{
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return;
}
tlist->length = 0;
tlist->header.next = NULL;
tlist->header.pre = NULL;
tlist->slider = NULL;
return;
}
int LinkList_Length(LinkList * list)
{
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return -1;
}
return tlist->length;
}
int LinkList_Insert(LinkList * list, LinkListNode *node, int pos)
{
if (list == NULL || node == NULL || pos < 0)
{
return 2;
}
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return -1;
}
int length = LinkList_Length(list);
if (pos > length)
{
return -3;
}
LinkListNode *current = NULL;
LinkListNode *last = NULL;
current = (LinkListNode *)list;
last = (LinkListNode *)list;
for (int i = 0; i < pos; i++)
{
current = current->next;
last = last->next;
}
if (tlist->length == 0)//如果第一次插入元素
{
current->next = node;
node->next = NULL;
node->pre = NULL;
tlist->slider = node;
tlist->length++;
return 0;
}
if (tlist->length == pos)//如果插入尾部的话
{
node->next = current->next;
current->next = node;
node->pre = current;
tlist->length++;
return 0;
}
last = last->next;
node->next = last;
current->next = node;
node->pre = last->pre;
last->pre = node;
if (current == (LinkListNode *)list)//如果插入的是头结点
{
node->pre = NULL;
tlist->slider = node;
}
tlist->length++;
return 0;
}
LinkList * LinkList_Get(LinkList *list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return NULL;
}
int length = LinkList_Length(list);
if (pos >= length)
{
return NULL;
}
LinkListNode *current = NULL;
current = (LinkListNode *)list;
for (int i = 0; i < pos; i++)
{
current = current->next;
}
return (LinkList *)current->next;
}
LinkList * LinkList_Delete(LinkList * list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return NULL;
}
int length = LinkList_Length(list);
if (pos >= length)
{
return NULL;
}
LinkListNode *current = NULL;
LinkListNode *last = NULL;
current = (LinkListNode *)list;
LinkListNode *ret = NULL;
last = (LinkListNode *)list;
for (int i = 0; i < pos; i++)
{
current = current->next;
last = last->next;
}
if (tlist->length == 1)// 如果删除的是最后一个元素
{
ret = last->next;//缓存要删除的元素
LinkList_Clear(list);//清空链表
return ret;
}
if (tlist->length-1 == pos)//如果删除尾部的话
{
ret = last->next;
current->next = NULL;
tlist->length--;
return ret;
}
ret = last->next;//缓存要删除的元素
last = last->next->next;//保存要删除的后面那个元素
current->next = last;
last->pre = current;
if (current == (LinkListNode *)list)//如果删除的是头结点
{
last->pre = NULL;
tlist->slider = last;
}
tlist->length--;
return ret;
}
LinkList * LinkList_GetPre(LinkList *list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return NULL;
}
int length = LinkList_Length(list);
if (pos >= length)
{
return NULL;
}
LinkListNode *current = NULL;
current = (LinkListNode *)list;
for (int i = 0; i < pos; i++)
{
current = current->next;
}
return (LinkList *)current->next->pre;
}
LinkList * LinkList_GetNext(LinkList *list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TLinkList *tlist = NULL;
tlist = (TLinkList *)list;
if (tlist == NULL)
{
return NULL;
}
int length = LinkList_Length(list);
if (pos >= length)
{
return NULL;
}
LinkListNode *current = NULL;
current = (LinkListNode *)list;
for (int i = 0; i < pos; i++)
{
current = current->next;
}
return (LinkList *)current->next->next;
}
最后是测试程序;
#include "linklist.h"
typedef struct Teacher
{
LinkListNode node;
int age;
}Teacher;
void main()
{
int ret = 0;
Teacher t1, t2, t3, t4;
t1.age = 11;
t2.age = 22;
t3.age = 33;
t4.age = 44;
LinkList *list = NULL;
list = LinkList_Create();
if (list == NULL)
{
printf("创建链表失败\n");
goto END;
}
int length = 0;
length = LinkList_Length(list);
printf("未插入数据时的长度%d\n", length);
ret = LinkList_Insert(list, (LinkListNode *)(&t1), 0);
if (ret != 0)
{
printf("插入失败 %d\n", ret);
goto END;
}
ret = LinkList_Insert(list, (LinkListNode *)(&t2), 1);
if (ret != 0)
{
printf("插入失败 %d\n", ret);
goto END;
}
ret = LinkList_Insert(list, (LinkListNode *)(&t3), 0);
if (ret != 0)
{
printf("插入失败 %d\n", ret);
goto END;
}
ret = LinkList_Insert(list, (LinkListNode *)(&t4), 3);
if (ret != 0)
{
printf("插入失败 %d\n", ret);
goto END;
}
length = LinkList_Length(list);
printf("插入数据时的长度%d\n", length);
Teacher *tmp = NULL;
tmp = (Teacher *)LinkList_Get(list, 1);
printf("第二个老师的年龄是%d\n", tmp->age);
tmp = (Teacher *)LinkList_GetPre(list, 1);
printf("第一个老师的年龄是%d\n", tmp->age);
tmp = (Teacher *)LinkList_GetNext(list, 1);
printf("第三个老师的年龄是%d\n", tmp->age);
tmp = (Teacher *)LinkList_Delete(list, 0);
printf("删除的老师的年龄是%d\n", tmp->age);
LinkList_Clear(list);
LinkList_Destroy(list);
END:
system("pause");
}