运行的结果如下所示:
/*实现有序双向循环链表的插入操作*/
#include <stdio.h>
#include <malloc.h>
typedef struct DbNode
{
int data;
struct DbNode *left;
struct DbNode *right;
}DbNode;
/*根据数据创建节点*/
DbNode *CreateNode(int data)
{
DbNode *pnode = (DbNode *)malloc(sizeof(DbNode)); /*创建新节点*/
pnode->data = data;
pnode->left = pnode;
pnode->right = pnode; /*创建新节点时,让其前驱和后继指针都指向本身*/
return pnode;
}
/*在表尾插入新节点,返回表头节点*/
DbNode *AppendNode(DbNode *head , int data) /*参数1为表头节点,2为插入的节点,数据为data*/
{
DbNode *node = CreateNode(data); /*创建数据为data的指针*/
DbNode *p = NULL;
DbNode *q = NULL;
if(head == NULL)
{
return NULL;
}
q = p = head->right;
while(p != head)
{
q = p;
p = p->right;
}
q->right = node;
node->left = q;
node->right = head;
head->left = node;
return head;
}
/*************************************************************************************************************/
/*打印整个链表*/
void PrintList(DbNode *head)
{
DbNode *pnode = NULL;
if(head == NULL) /*head为NULL表示链表空*/
{
return;
}
printf("%d " , head->data);
pnode = head->right;
while(pnode != head)
{
printf("%d " , pnode->data);
pnode = pnode->right;
}
printf("\n");
}
/*************************************************************************************************************/
/*插入一个有序链表(从小到大排序),返回表头*/
DbNode *InsertNode(DbNode *head , int data)
{
DbNode *p = NULL , *q = NULL;
DbNode *node = NULL;
node = CreateNode(data); /*新建数据节点*/
if(head == NULL) /*空链表,返回新建节点*/
{
head = node;
return node;
}
if(head->data > data) /*data小于表头数据,插入到表头之前*/
{
head->left->right = node; /*把新建节点作为表头末节点后继指针指向node*/
node->left = head->left; /*node的前驱指针指向末节点*/
node->right = head; /*node的后继指针指向head*/
head->left = node; /*node的前驱指针指向node*/
return node;
}
p = head->right;
while(p->data <= data && p != head)
{
p = p->right;
}
p = p->left;
q = p->right;
/*把node插入到p \ q之间*/
p->right = node;
node->left = p;
node->right = q;
q->left = node;
return head;
}
int main()
{
DbNode *head = CreateNode(2); /*创建表头节点,数据为1*/
head = InsertNode(head , 3);
head = InsertNode(head , 4);
head = InsertNode(head , 8);
head = InsertNode(head , 6);
PrintList(head);
head = InsertNode(head , 1);
PrintList(head);
head = InsertNode(head , 10);
PrintList(head);
head = InsertNode(head , 0);
PrintList(head);
head = InsertNode(head , 9);
PrintList(head);
return 0;
}