双向链表不仅可以从头向尾查找也可以从尾向头查找。
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#ifdef _DEBUG
#include<vld.h>
#endif /*_DEBUG*/
typedef struct _dlist
{
int data;
struct _dlist *p_head;
struct _dlist *p_tail;
}DList,Node;
int dlist_lenght(DList* list);
void insert_head(int data, DList* list)
{
Node* node = (Node*)malloc(sizeof(Node));
memcpy(node, list, sizeof(Node));
list->data = data;
list->p_head = NULL;
list->p_tail = node;
node->p_head = list;
if (dlist_lenght(list) > 2)
{
Node* tmp = node->p_tail;
tmp->p_head = node;
}
}
int dlist_lenght(DList* list)
{
int count = 0;
Node* tmp = list;
while (tmp)
{
count++;
tmp = tmp->p_tail;
}
return count;
}
void delete_tail(DList* list)
{
if (list == NULL)
return;
if (list->p_head == NULL && list->p_tail == NULL)
{
free(list);
list = NULL;
return;
}
Node* tail = NULL;
Node* prev = NULL;
Node* temp = list;
while (temp->p_tail!=NULL)
{
temp = temp->p_tail;
}
tail = temp;
prev = temp->p_head;
free(tail);
if(prev!=NULL)
prev->p_tail = NULL;
}
void dlist_free(DList* list)
{
if (list == NULL)
return;
Node* tmp = NULL;
while (list)
{
tmp = list->p_tail;
free(list);
list = tmp;
}
}
void print(DList* list)
{
if (list == NULL)
return;
Node *tmp = list;
while (tmp!=NULL)
{
printf("Data:%d\np_head:%p\np_tail:%p\n", tmp->data,tmp->p_head,tmp->p_tail);
tmp = tmp->p_tail;
}
}
int main()
{
DList* dlst = (DList*)malloc(sizeof(DList));
dlst->data = 1001;
dlst->p_head = NULL;
dlst->p_tail = NULL;
printf("lenght of list is %d .\n", dlist_lenght(dlst));
print(dlst);
insert_head(101, dlst);
insert_head(102, dlst);
insert_head(103, dlst);
insert_head(104, dlst);
printf("lenght of list is %d .\n", dlist_lenght(dlst));
print(dlst);
printf("---------------------------------\n");
delete_tail(dlst);
printf("lenght of list is %d .\n", dlist_lenght(dlst));
print(dlst);
printf("---------------------------------\n");
delete_tail(dlst);
printf("lenght of list is %d .\n", dlist_lenght(dlst));
print(dlst);
printf("---------------------------------\n");
delete_tail(dlst);
printf("lenght of list is %d .\n", dlist_lenght(dlst));
print(dlst);
dlist_free(dlst);
return 0;
}