#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int Elemtype;
typedef struct Node
{
Elemtype data;
struct Node *pre;
struct Node *next;
} Node, *ptrNode;
void InitList(ptrNode ptr)
{
ptr->pre = ptr;
ptr->next = ptr;
ptr->data = 0;
}
ptrNode CreatNode(Elemtype data)
{
ptrNode node = (ptrNode)malloc(sizeof(Node));
if (node)
{
node->data = data;
node->next = node->pre = NULL;
return node;
}
else
return NULL;
}
void PrintList(ptrNode p)
{
ptrNode raw = p;
if (p->next != p)
{
p = p->next;
do
{
printf("%d ", p->data);
p = p->next;
} while (raw != p);
printf("\n");
}
else
printf("NULL!\n");
}
ptrNode SearchPos(ptrNode p, int pos)
{
if (p->next == p)
if (pos == 0)
return p;
else
return NULL;
ptrNode raw = p;
for (int i = 0; i < pos+1; i++)
{
p = p->next;
if (p == raw)
return NULL;
}
return p;
}
int InsertData(ptrNode pnode, int pos, Elemtype data)
{
if (pnode->next == pnode) // 无数据
{
ptrNode node = CreatNode(data);
if (node) // 创建成功
{
pnode->next = node;
node->pre = pnode;
node->next = pnode;
pnode->pre = node;
return 1;
}
}
else
{
ptrNode found = SearchPos(pnode, pos);
if (found)
{
ptrNode node = CreatNode(data);
node->pre = found->pre;
found->pre->next = node;
node->next = found;
found->pre = node;
return 1;
}
else // 找不到就插尾部
{
ptrNode node = CreatNode(data);
pnode->pre->next = node;
node->pre = pnode->pre;
node->next = pnode;
pnode->pre = node;
return 1;
}
return 0;
}
printf("insert error\n");
return 0;
}
int DeletePos(ptrNode p,int pos)
{
ptrNode found = SearchPos(p, pos);
if (found)
{
found->pre->next = found->next;
found->next->pre = found->pre;
free(found);
}
else
return 0;
}
void Destroy(ptrNode p)
{
while (p->next != p)
DeletePos(p,0);
}
int main()
{
Node Head;
InitList(&Head);
ptrNode pNode = &Head;
InsertData(pNode, 0, 1);
InsertData(pNode, 1, 2);
InsertData(pNode, 2, 3);
InsertData(pNode, 0, 4);
PrintList(pNode);
DeletePos(pNode,0);
PrintList(pNode);
Destroy(pNode);
PrintList(pNode);
return 0;
}