#include <stdio.h>
#include <stdlib.h>
#define MAL_OK 1
#define MAL_ERR 0
struct dblnode
{
int num;
struct dblnode * next;
struct dblnode * prior;
};
typedef struct dblnode DblNode;
typedef struct dblnode * DblLink;
void creat_link(DblLink * head);
void creat_node(DblLink * new_node, int i);
int judge_node(DblLink new_node);
void insert_node_head(DblLink new_node, DblLink head);
void insert_node_tail(DblLink new_node, DblLink head);
void insert_node_mid(DblLink new_node, DblLink head, int num_loc);
void delete_node(DblLink head, int num_del);
void display(DblLink head);
void release_link(DblLink * head);
void makempty_link(DblLink head);
void reverse_link(DblLink * head);
int length_link(DblLink head);
int main()
{
DblLink head = NULL;
DblLink new_node = NULL;
int i, num_loc, num_val, num_del,n;
creat_link(&head);
for (i = 0;i < 10;i++)
{
creat_node(&new_node,i);
insert_node_head(new_node,head);
//insert_node_tail(new_node,head);
}
display(head);
printf("链表的长度为:%d\n",n = length_link(head));
printf("************\n");
printf("输入待插入元素的位置和数值\n");
scanf("%d%d",&num_loc,&num_val);
creat_node(&new_node,num_val);
insert_node_mid(new_node,head,num_loc);
display(head);
printf("链表的长度为:%d\n",n = length_link(head));
printf("***************\n");
printf("输入待删除元素的数值\n");
scanf("%d",&num_del);
delete_node(head, num_del);
display(head);
printf("链表的长度为:%d\n",n = length_link(head));
printf("***************\n");
makempty_link(head);
//release_link(&head);
display(head);
return 0;
}
void creat_link(DblLink * head)
{
DblLink new_node;
new_node = (DblLink)malloc(sizeof(DblNode));
*head = new_node;
new_node->num = 999;
new_node->next = new_node->prior = *head;
}
int judge_node(DblLink new_node)
{
if (new_node == NULL)
return MAL_ERR;
else
return MAL_OK;
}
void creat_node(DblLink * new_node, int i) //创建结点包括申请内存分配和给num赋值
{
do
{
*new_node = (DblLink)malloc(sizeof(DblNode));
}while(judge_node(*new_node) == MAL_ERR);
(*new_node)->num = i;
}
void insert_node_head(DblLink new_node, DblLink head)
{
/*if (length_link(head) == 0) //提醒!!!
head->prior = new_node; //分情况讨论
else
head->next->prior = new_node;
new_node->next = head->next;
new_node->prior = head;
head->next = new_node;
*/
DblLink p = head->next; //定义一个指向表头下一个结点的指针
new_node->next = p;
new_node->prior = head;
head->next = new_node;
p->prior = new_node;
}
void insert_node_tail(DblLink new_node, DblLink head) //尾插结点
{
DblLink p = head->prior;
new_node->next = head;
new_node->prior = p;
p->next = new_node;
head->prior = new_node;
}
void insert_node_mid(DblLink new_node, DblLink head, int num_loc)//中插(前插)
{
DblLink p;
p = head;
while(p->num != num_loc && p->next != head) //寻找待插入值的所在位置
p = p->next;
if(p->next == head && p->num != num_loc ) //未找到,尾插
{
p->next = new_node;
head->prior = new_node;
new_node->next = head;
new_node->prior = p;
}
else
{
new_node->next = p;
new_node->prior = p->prior;
p->prior->next = new_node;
p->prior = new_node;
}
}
void delete_node(DblLink head, int num_del) //删除结点
{
DblLink p = head;
while(p->num != num_del && p->next != head)
p = p->next;
if(p->next == head && p->num != num_del)
printf("待删除元素未找到\n");
else
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
}
void display(DblLink head)
{
DblLink p = head; // 提醒 !!!
if (head == NULL)
printf("链表不存在\n");
else if(head->next == head)
printf("链表为空\n");
else
{
p = head->next;
while(p != head)
{
printf("num = %d\n",p->num);
p = p->next;
}
}
}
void makempty_link(DblLink head) //清空链表
{
DblLink p = head;
if (head == NULL)
printf("Link is null!!!!!!!\n");
else
{
p = p->next;
while(p != head)
{
p = p->next;
free(p->prior);
}
p->next = head;
p->prior = head;
}
if (length_link(head) == 0)
printf("链表清空完毕,其长度为%d\n",length_link(head));
else
printf("清空失败\n");
}
void release_link(DblLink * head)
{
DblLink p = *head;
if (*head == NULL)
printf("Link is empty!!!!!!!\n");
else
{
p = p->next;
while(p != *head)
{
p = p->next;
free(p->prior);
}
}
*head = NULL;
free(*head);
}
int length_link(DblLink head)
{
DblLink p = head->next;
int count = 0;
while (p != head)
{
p = p->next;
count++;
}
return count;
}