*****双向链表的实现*****
双链表就可以看成两个单链表组合成的,只是相比单链表而言,它能从两个方向进行遍历链表,目前还不知道这有什么
优势,因为当我们想查找一个元素时,并不知道一个有序的链表里面这个被查找的元素离哪一边较近。
(1)双链表的结构与单链表有点不一样,它要保证从链表的任意一端都能遍历链表,所以下面是双链表里面的结点的结构:
typedef structdouList
{
struct douList *prior;
struct douList *next;
int data;
}DouList;
(2)双向链表的创建,并初始化:
DouList *Creat_List()
{
DouList *root = NULL;
DouList *pre = NULL;
DouList *cur = NULL;
int data = 0;
int i = 0;
root = (DouList*)malloc(sizeof(DouList));
if(NULL == root)
{
printf("ERROR:Can't malloc the root.\n");
exit(ERROR);
}
root->next = NULL;
root->prior = NULL;
pre = root;
while(++i <= 10)
{
cur = (DouList*)malloc(sizeof(DouList));
if(NULL == cur)
{
printf("ERROR:Can't malloc the current List\n");
exit(ERROR);
}
//init the cur
cur->next =NULL;
cur->prior =NULL;
cur->data =2*i - 1;
//connect theDoubly Linked List
pre->next =cur;
cur->next =NULL;
if(pre == root)
{
cur->prior= NULL;
pre->prior= NULL;
pre->prior= cur;
}
else
{
root->prior= cur;
cur->prior= pre;
}
pre = cur;
}
return root;
}
(2)双向链表的遍历:
<1>正向遍历,即以next方向遍历:
voidShow_NextList(DouList *root)
{
DouList *pre = root->next;
printf("This is the doublylinked list in the next order;\n");
while(NULL != pre)
{
printf("%d\n",pre->data);
pre =pre->next;
}
}
<2>反向遍历,即以prior方向遍历:
voidShow_PriorList(DouList *root)
{
DouList *pre = root->prior;
printf("This is the doublylinked list in the prior order;\n");
while(NULL != pre)
{
printf("%d\n",pre->data);
pre =pre->prior;
}
}
(3)查找结点,同样这里只实现返回结点:
<1>正向查找:
DouList*Find_NextList(DouList *root)
{
DouList *cur = root->next;
int data;
printf("Enter a data youwant to find in next order:\n");
scanf("%d",&data);
while(NULL != cur)
{
if(data ==cur->data)
{
returncur;
}
cur =cur->next;
}
return NULL;
}
<2>反向查找:
DouList*Find_PriorList(DouList *root)
{
DouList *cur = root->prior;
int data;
printf("Enter a data youwant to find in prior order:\n");
scanf("%d",&data);
while(NULL != cur)
{
if(data ==cur->data)
{
returncur;
}
cur =cur->prior;
}
return NULL;
}
(4)插入新结点:(仅实现了next方向的插入)
DouList*Insert_List(DouList *root)
{
DouList *cur = root->next;
DouList *pre = root;
int data = 0;
DouList *newList = NULL;
printf("Enter the data youwant to insert:\n");
scanf("%d",&data);
newList = (DouList*)malloc(sizeof(DouList));
if(NULL == newList)
{
printf("ERROR:Can't malloc the new List.\n");
exit(ERROR);
}
newList->data = data;
newList->next = NULL;
newList->prior = NULL;
while(NULL != cur->next)
{
//find thelocation which need to be inserted
if(data < cur->data)
{
//ifthe new List in the front of the first List(except the root)
if(root->next== cur)
{
root->next= newList;
newList->next= cur;
newList->prior= NULL;
cur->prior= newList;
}
//ifthe new List in the front of the last List
//whenin the order of next
else
{
pre->next= newList;
newList->next= cur;
newList->prior= pre;
cur->prior= newList;
}
break;
}
//move thepointer to the doubly linked list
else
{
pre= cur;
cur= cur->next;
}
}
if(NULL == cur->next)
{
//insert the newList in the front of last List
if(data <cur->data)
{
pre->next= newList;
newList->next= cur;
cur->prior= newList;
newList->prior= pre;
}
//insert the newList in the last List
else
{
cur->next= newList;
newList->next= NULL;
newList->prior= cur;
root->prior= newList;
}
}
//insert successe
return newList;
}
(5)删除结点:(仅实现了以next的方向)
DouList*Delete_List(DouList *root)
{
DouList *cur = root->next;
DouList *pre = root;
DouList *deleteList = NULL;
int data;
printf("Enter a data youwant to delete:\n");
scanf("%d",&data);
while(NULL != cur->next)
{
if(data ==cur->data)
{
deleteList= cur;
//ifthe list to delete is in the first List(except the root)
if(root->next== cur)
{
cur->next->prior= NULL;
root->next= cur->next;
}
//ifthe list to delete isn't in the first List(except the root)
else
{
pre->next= cur->next;
cur->next->prior= pre;
}
free(cur);
//thedeleteList is connected with the cur
//whencur was free,deleteList will become shakable
//shouldinit the deleteList to let the return's use
deleteList->next= NULL;
deleteList->prior= NULL;
deleteList->data= data;
returndeleteList;
}
else
{
pre= cur;
cur= cur->next;
}
}
//when the list to delete is inthe last List
if(data == cur->data)
{
deleteList = cur;
pre->next =NULL;
root->prior =pre;
free(cur);
deleteList->next= NULL;
deleteList->prior= NULL;
deleteList->data= data;
returndeleteList;
}
return NULL;
}
*****总结*****
这次能够实现这两种链表的功能,这要靠两种工具:
(1)严老师的《数据结构》一书,里面提供了链表实现的各种的思想基础
(2)调试,以前总看别人写的东西都说C程序员必须学会调试,这次实现这些东西的一大利器
就是它了,初次使用调试来解决指针问题,真心觉得它的前途无限。