/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct dblnode
{
int num;
struct dblnode *prior;//前驱
struct dblnode *next;//后继
};
typedef struct dblnode Dblnode;
typedef Dblnode * Dbllink;
void is_malloc_ok(Dbllink new_node)
{
if(NULL == new_node)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_node(Dbllink *new_node)
{
*new_node = (Dbllink)malloc(sizeof(Dblnode));
is_malloc_ok(*new_node);
}
void create_link(Dbllink *head)
{
create_node(head);//只有一个结点
(*head)->prior = *head;//头结点的前驱指向最后一个
(*head)->next = *head;//后继指向自己
}
/*头插*/
void insert_node_head(Dbllink head,Dbllink new_node)
{
new_node->next = head->next;//自己结点的后继指向头后面的结点
new_node->prior = head;//自己的结点的前驱指向头
head->next = new_node;//头的后继指向自己
new_node->next->prior = new_node;//自己后面结点的前驱指向自己
}
/*显示*/
void display(Dbllink head)
{
Dbllink p;
// p = head->next;
if(NULL == head)
{
printf("no such link\n");
return;
}
p = head->next;
if(p == head)
{
printf("link is empty!\n");
return;
}
while(p != head)
{
printf("%d\n",p->num);
p = p->next;
}
}
/*尾插*/
void insert_node_tail(Dbllink head,Dbllink new_node)
{
Dbllink p;
p = head;
while(head != p->next)
{
p = p->next;
}
new_node->next = p->next;
new_node->prior = p;
p->next = new_node;
new_node->next->prior = new_node;
}
/*中间插入*/
void insert_node_mid_front(Dbllink head,Dbllink new_node,int loc)
{
Dbllink p,q;
q = head;
p = head;
if(head == head->next)
{
new_node->next = head;
head->next = new_node;
}
else
{
while(p->next != head && p->num != loc)
{
q = p;
p = p->next;
}
new_node->next = p;
new_node->prior = q;
q->next = new_node;
new_node->next->prior = new_node;
}
}
/* 删除 */
void delete_node(Dbllink *head,int num_del)
{
Dbllink p,q;
q = *head;
p = (*head)->next;
while(p != (*head) && p->num != num_del)
{
q = p;
p = p->next;
}
if(p == (*head))
{
printf("no such node!\n");
}
else
{
q->next = p->next;
p->next->prior = q;
free(p);
}
}
/*寻找*/
Dbllink search_node(Dbllink head,int num_search)
{
Dbllink p;
p = head->next;
while(p !=head && p->num != num_search)
{
p = p->next;
}
if(head == p)
{
return NULL;
}
else
{
return p;
}
}
/*随机数*/
void insert_node_sort(Dbllink head,Dbllink new_node)
{
Dbllink p,q;
q = head;
p = head->next;
while(p !=head && p->num < new_node->num)
{
q = p;
p = p->next;
}
new_node->next = p;
new_node->prior = q;
q->next = new_node;
new_node->next->prior = new_node;
}
/*清空*/
void make_empty(Dbllink head)
{
Dbllink p;
p = head->next;
while(head != p)
{
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
p = head->next;
}
}
/*释放*/
void release_link(Dbllink * head)
{
make_empty(*head);
free(*head);
*head = NULL;
}
int main()
{
Dbllink head = NULL;
Dbllink new_node;
int i;
int loc;
int num_del;
int num_search; //寻找
Dbllink p_search;
create_link(&head);
srand((unsigned)time(NULL));
for(i = 0;i < 10;i++)
{
create_node(&new_node);
// new_node->num = i + 1;
new_node->num = rand() % 100;
// insert_node_head(head,new_node);
// insert_node_tail(head,new_node);
insert_node_sort(head,new_node);
}
/* 中插
create_node(&new_node);
new_node->num = 100;
display(head);
printf("\n\n");
printf("please input loc:\n");
scanf("%d",&loc);
insert_node_mid_front(head,new_node,loc);
display(head);
*/
/* 删除
display(head);
printf("\n\n");
printf("please input num to delete:\n");
scanf("%d",&num_del);
delete_node(&head,num_del);
display(head);
*/
/* 查找
display(head);
printf("please input num to search");
scanf("%d",&num_search);
p_search = search_node(head,num_search);
if(NULL == p_search)
{
printf("no such node!\n");
}
else
{
printf("what num you search is:%d\n",p_search->num);
}
*/
display(head);
make_empty(head);
display(head);
release_link(&head);
display(head);
return 0;
}
08-10
08-10
08-10