//练习了双向循环链表的头插,尾插,中间插入(前、后), 释放链表,节点,边插入边排序,插入节点的功能
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct dnode
{
int num;
struct dnode * next;
struct dnode * prior;
};
typedef struct dnode Dnode;
typedef struct dnode * Link;
void is_malloc_ok(Link node)
{
if(node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_node(Link * node)
{
*node = (Link)malloc(sizeof(Dnode));
is_malloc_ok(*node);
}
void create_head(Link * head)
{
create_node(head);
(*head)->next = (*head)->prior = *head;
}
void insert_node_head(Link head, Link new_node)
{
Link p;
p = head;
new_node->prior = p;
new_node->next = p->next;
p->next = new_node;
new_node->next->prior = new_node;
}
void insert_node_tail(Link head, Link new_node)
{
Link p;
p = head;
new_node->prior = p->prior;
new_node->next = p;
p->prior->next = new_node;
p->prior = new_node;
}
void insert_midh(Link head, int m, Link new_node) //n:数
{
Link p;
p = head->next;
while(p != head && p->num != m) //插在p前面
{
p = p->next;
}
new_node->next = p;
new_node->prior = p->prior;
p->prior->next = new_node;
p->prior = new_node;
}
void insert_midt(Link head, int m, Link new_node) //n:数
{
Link p;
p = head;
while(p->next != head && p->num != m) //插在p后面
{
p = p->next;
}
new_node->next = p->next;
new_node->prior = p;
p->next->prior = new_node;
p->next = new_node;
}
void insert_sort(Link head, Link new_node)
{
Link p;
p = head->next;
while(p != head && new_node->num > p->num) //插在p前面
{
p = p->next;
}
new_node->next = p;
new_node->prior = p->prior;
p->prior->next = new_node;
p->prior = new_node;
}
void delete_node(Link head, int k)
{
Link p;
p = head->next;
while(p != head && p->num != k)
{
p = p->next;
}
p->prior->next = p->next;
p->next->prior = p->prior;
}
void display_link(Link head)
{
Link p;
if(head == NULL)
{
printf("link is empty!\n");
return;
}
p = head->next;
while(p != head)
{
printf("%d\n", p->num);
p = p->next;
}
}
void release_node(Link head)
{
Link p;
Link q;
p = head->next;
q = p;
while(p != head)
{
q = p->next;
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
p = q;
}
}
void release_link(Link * head)
{
Link p;
p = *head;
release_node(*head);
(*head)->next = NULL;
*head = (*head)->next;
free(p);
}
int main()
{
srand((unsigned)time(NULL));
int i;
//int m, n;
int k;
Link head = NULL;
Link new_node = NULL;
create_head(&head);
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_sort(head, new_node);
}
display_link(head);
/*printf("输入要插入的数和插入位置:");
scanf("%d%d", &n, &m);
create_node(&new_node);
new_node->num = n;
insert_midt(head, m, new_node);
display_link(head);
*/
printf("选择要删除的数:");
scanf("%d", &k);
delete_node(head, k);
display_link(head);
release_link(&head);
display_link(head);
return 0;
}