#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node
{
int data;
struct Node *pNext;
struct Node *pRior;
} NODE, *PNODE;
PNODE pHead;
PNODE init_link(int data);
bool crate_link(PNODE, int);
void traverse(PNODE);
bool insert_tail(PNODE pHead, PNODE pNew);
bool insert_head(PNODE pHead, PNODE pNew);
bool insert_position(PNODE pHead, PNODE pNew, int pos);
bool delete_node(PNODE pHead, int pos, int *data);
int main()
{
int data = 0;
pHead = init_link(0);
if (crate_link(pHead, 5))
{
printf("创建链表成功\n");
}
traverse(pHead);
printf("=============insert 0 in tail=================\n");
insert_tail(pHead, init_link(0));
traverse(pHead);
printf("=============insert 6 in head=================\n");
insert_head(pHead, init_link(6));
traverse(pHead);
printf("=============insert 7 in pos1=================\n");
insert_position(pHead, init_link(7), 8);
traverse(pHead);
printf("=============delete an pos8=================\n");
delete_node(pHead, 8, &data);
traverse(pHead);
printf("delete data is %d\n", data);
return 0;
}
PNODE init_link(int data)
{
PNODE pNode = (PNODE)malloc(sizeof(NODE));
if (NULL == pNode)
{
printf("动态分配内存失败\n");
exit(-1);
}
pNode->pNext = NULL;
pNode->pRior = NULL;
pNode->data = data;
return pNode;
}
bool crate_link(PNODE pHead, int len)
{
if (NULL == pHead)
return false;
PNODE list = pHead;
do
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态分配内存失败\n");
exit(-1);
}
pNew->data = len;
pNew->pNext = NULL;
pNew->pRior = NULL;
list->pNext = pNew;
pNew->pRior = list;
list = list->pNext;
} while (--len);
return true;
}
void traverse(PNODE pHead)
{
if (NULL == pHead)
return;
PNODE p = pHead;
while (NULL != p->pNext)
{
printf("%d ", p->pNext->data);
p = p->pNext;
}
putchar('\n');
while (p->pRior != NULL)
{
printf("%d ", p->data);
p = p->pRior;
}
putchar('\n');
}
bool insert_tail(PNODE pHead, PNODE pNew)
{
if (NULL == pHead)
{
printf("请先初始化链表\n");
return false;
}
PNODE p = pHead;
while (NULL != p->pNext)
{
p = p->pNext;
}
p->pNext = pNew;
pNew->pRior = p;
pNew->pNext = NULL;
return true;
}
bool insert_head(PNODE pHead, PNODE pNew)
{
if (NULL == pHead)
{
printf("请先初始化链表\n");
return false;
}
if (pHead->pNext == NULL)
{
pHead->pNext = pNew;
}
else
{
PNODE p = pHead;
p->pNext->pRior = pNew;
pNew->pNext = p->pNext;
p->pNext = pNew;
pNew->pRior = p;
}
return true;
}
int getlinklen()
{
int len = 0;
PNODE p = pHead->pNext;
while (p != NULL)
{
len++;
p = p->pNext;
}
return len;
}
bool insert_position(PNODE pHead, PNODE pNew, int pos)
{
int len = 0;
if (NULL == pHead)
{
printf("请先初始化链表\n");
return false;
}
len = getlinklen();
printf("link length is %d\n", len);
if (pos < 1 || pos > len + 1)
{
return false;
}
else
{
PNODE p = pHead;
while (p->pNext != NULL && pos--)
{
p = p->pNext;
}
if (p->pNext == NULL && pos == 1)
{
p->pNext = pNew;
pNew->pRior = p;
}
else
{
p->pRior->pNext = pNew;
pNew->pNext = p;
pNew->pRior = p->pRior;
p->pRior = pNew;
}
}
return true;
}
bool delete_node(PNODE pHead, int pos, int *data)
{
int len = 0;
if (NULL == pHead)
{
printf("请先初始化链表\n");
return false;
}
len = getlinklen();
printf("link length is %d\n", len);
if (pos < 1 || pos > len)
{
return false;
}
else
{
PNODE p = pHead;
while (pos--)
{
p = p->pNext;
}
if (p->pNext == NULL)
{
*data = p->data;
p->pRior->pNext = NULL;
free(p);
p->pRior = NULL;
}
else
{
*data = p->data;
p->pRior->pNext = p->pNext;
p->pNext->pRior = p->pRior;
free(p);
p->pNext = NULL;
p->pRior = NULL;
}
return true;
}
}