10实现有序双向循环链表的插入操作

运行的结果如下所示:

015实现有序双向循环链表的插入操作 - 458905216 - SaEe的博客

/*实现有序双向循环链表的插入操作*/
#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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值