#include<stdio.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct linode
{
STDataType data;
struct linode* next;
struct linode* prve;
}SL;
//双向链表实现的函数功能有 :1.申请动态内存空间 2.初始化 3.双向链表的头,尾的插入与删除,在合法的任意位置进行插入和删除 4.释放链表,5.打印链表
//申请动态内存空间
SL* Bylist(STDataType x)//会写到插入函数中
{
SL* newnode = (SL*)malloc(sizeof(SL));
newnode->data = x;
newnode->next = NULL;
newnode->prve = NULL;
return newnode;
}
//初始化(创建一个链表的头
SL* ListCreate()
{
SL* phead = Bylist(0);
phead->next = phead;
phead->prve = phead;
return phead;
}
SL* plist = ListCreate();//创建返回链表的头结点
//尾插法
void ListPushBack(SL* pHead, STDataType x)
{
SL* end = pHead->prve;//表尾
SL* newnode = Bylist(x);//创建一个节点
end->next = newnode;
newnode->prve = end;//存放尾节点的地址
newnode->next = pHead;//将现在的表尾指向表头
pHead->prve = newnode;//再让表头指向上一个的指针
}
//尾删法
void ListPopBack(SL* pHead)
{
SL* end = pHead->prve;//找到最后一个节点
SL* cur = end->prve;//倒数第二个节点
cur->next = pHead;
pHead->prve = cur;
free(end);
end = NULL;
}
//头插法
void ListPushFront(SL*pHead, STDataType x)
{
SL* cur = pHead->next;//表头的下一个节点
SL* newnode = Bylist(x);
pHead->next = newnode;
newnode->prve = pHead;
cur->prve = newnode;
}
//头删法
void ListPopFront(SL* pHead)
{
SL* cur = pHead->next;
SL* cur2 = cur->next;//第三个节点
pHead->next = cur2;
cur2->prve = pHead;
free(cur);
}
//查找
SL* ListFind(SL* pHead, STDataType x)//查找
{
SL* cur = pHead->next;
while (cur != pHead)
{
if (cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
SL* pos = ListFind(plist, 5);
//对pos前一个位置进行插入数据(略)
//对pos这个位置进行深处(略)
//链表的打印
void ListPrint(SL* pHead)//打印链表
{
SL* cur = pHead->next;//表头的下一个数据
while (cur != pHead)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("pHead");
}
//链表的释放
void ListDestory(SL* pHead)
{
SL* cur = pHead->next;
while (cur != pHead)
{
SL* cur2 = cur->next;
free(cur);
cur = cur2;
}
free(pHead);
pHead = NULL;
}