双向循环链表
来源:互联网 发布:一天赚几万的网络违法 编辑:程序博客网 时间:2024/05/02 01:53
双向循环链表
背景:
因链表操作是数据结构的基础。对每个程序员来说,都是最基础的编程技术。有必要熟练的掌握其中的技术。
分析:
链表的好处毋庸多说。关键点:1。存储空间是动态分配,2。熟练指针操作。
在这里仅就一个插入节点的情况来分析:
tempAllot
新的节点
llink rlink
rlink llink
后节点 llink前节点
rlink
temp temp->rlink
插入节点的时候,好的方法就是:
1.将被temp的指针所指向的关系全部挂结到tempAllot上.
2.然后将tempAllot挂结到该挂结的指针上。
程序:
/**********************************************/
//双向循环链表的操作
//author:cheng_rliang
/**********************************************/
#include <iostream>
using namespace std;
/*定义节点类型*/
typedef struct node
{
int data;
struct node * llink;
struct node * rlink;
} NODE;
/*建立链表*/
NODE * createNode(int number)
{
NODE *head,*temp,*tempAllot;
if((head = (NODE*)malloc(sizeof(NODE))) == NULL) /*分配头节点的空间*/
{
printf("allot memory failure"); /*失败返回NULL*/
exit(0);
}
head->data = 0; /*头节点的初值*/
head->llink = NULL;
head->rlink = NULL;
temp = head; /*定义一个临时节点*/
for(int i = 0; i < number;i++) /*建指定个数节点*/
{
if((tempAllot = (NODE*)malloc(sizeof(NODE))) == NULL)
{
printf("allot memory failure");
exit(0);
}
temp->rlink = tempAllot;
tempAllot->llink = temp;
tempAllot->rlink = NULL;
printf("please insert data:");
scanf("%d",&(tempAllot->data));
temp = tempAllot;
}
head->llink = temp; /*将末节点和首节点相连*/
temp->rlink = head;
return head;
}
/*查找指定信息的节点*/
NODE * selectNode(NODE *head,int data)
{
NODE *temp = head;
while((temp = temp->rlink) != head)
{
if(temp->data == data)
{
return temp;
}
}
return NULL;
}
/*插入指定信息的节点*/
bool insertNode(NODE *head,int data)
{
NODE *temp = head;
NODE *tempAllot = (NODE*)malloc(sizeof(NODE));
if(tempAllot == NULL)
return false;
tempAllot->data = data;
tempAllot->llink = temp->llink; /*挂结左节点*/
tempAllot->rlink = temp; /*挂结右节点*/
temp->llink->rlink = tempAllot; /*挂结到右节点*/
temp->llink = tempAllot; /*挂结到左节点*/
return true;
}
/*删除指定信息的节点*/
bool deleteNode(NODE *head,int data)
{
NODE *temp = head;
while((temp = temp->rlink) != head)
{
if(temp->data == data)
{
temp->llink->rlink = temp->rlink;
temp->rlink->llink = temp->llink;
free(temp); /*切记:释放节点空间*/
return true;
}
}
return false;
}
/*打印整个链表*/
void printNode(NODE * head)
{
NODE *temp = head;
while((temp = temp->rlink) != head)
{
printf("%d/n",temp->data);
}
}
int main()
{
// for testing
NODE *noTemp = NULL;
noTemp = createNode(5);
insertNode(noTemp,10);
printNode(noTemp);
system("pause");
return 0;
}