带表头节点双向循环链表
代码:
#include <stdio.h>
#include <stdlib.h>
#define is_link 1
#define not_link 0
struct dblnode
{
int num;
struct dblnode *prior;
struct dblnode *next;
};
typedef struct dblnode Node;
typedef struct dblnode * Link;
int if_Link(Link newnode)
{
if(newnode == NULL)
{
printf("link is not creat\n");
return not_link;
}
else
{
return is_link;
}
}
void creatlink(Link *head)
{
do
{
*head = (Link)malloc(sizeof(Node));
}while(if_Link(*head) == not_link);
(*head)->prior = (*head)->next = *head;
}
void creatnode(Link *newnode, int i)
{
do
{
*newnode = (Link)malloc(sizeof(Node));
}while(if_Link(*newnode) == not_link);
(*newnode)->num = i;
}
void insert_node_tail(Link head , Link newnode)
{
newnode->prior = head->prior;
newnode->next = head;
head->prior->next = newnode;
head->prior = newnode;
}
void insert_node_head(Link head, Link newnode)
{
if(head == head->prior && head == head->next )
{
newnode->next = head;
head->prior = newnode;
}
else
{
head->next->prior = newnode;
newnode->next = head->next;
}
head->next = newnode;
newnode->prior = head;
}
void insert_node_mid(Link head,Link newnode)
{
Link p = head ;
int loc;
int i = 1 ;
int num;
printf("please input the location to insert\n");
scanf("%d",&loc);
printf("please input the num to add\n");
scanf("%d",&num);
p = p->next;
while(p != head )
{
if(i == loc)
{
newnode->prior = p->prior;
newnode->next = p;
p->prior->next = newnode;
p->prior = newnode;
newnode->num = num;
}
p = p->next;
i++;
}
}
void front_display(Link head)
{
Link p = head;
if(p == NULL)
{
printf("link is clear\n");
}
else
{
p = p->prior;
while( p != head)
{
printf("num = %d\n",p->num);
p = p->prior;
}
}
}
void back_display(Link head)
{
Link p = head ;
if(p == NULL)
{
printf("link is clear\n");
}
else
{
p = p->next;
while(p != head)
{
printf("num = %d\n",p->num);
p = p->next;
}
}
}
void delete_node(Link head)
{
Link p = head->next;
int num;
printf("please input a number to delete");
scanf("%d",&num);
while(p != head)
{
if(p->num == num)
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
p = p->next;
}
}
void release( Link *head)
{
Link p = (*head)->next;
if(*head == p)
{
printf("link is already clear\n");
free(p);
*head = NULL;
}
else
{
while( p != *head)
{
(*head)->next = p->next;
free(p);
p = (*head)->next;
}
free(*head);
*head = NULL;
}
}
int main()
{
Link head = NULL;
Link newnode = NULL;
int i ;
int n ;
creatlink(&head);
printf("please input the number of node you want to insert\n ");
scanf("%d",&n);
for(i = 1; i <= n;i++)
{
creatnode(&newnode,i);
insert_node_tail(head,newnode);
// insert_node_head(head,newnode);
}
front_display(head);
creatnode(&newnode,i);
insert_node_mid(head,newnode);
front_display(head);
printf("\n");
back_display(head);
delete_node(head);
front_display(head);
release(&head);
front_display(head);
return 0;
}
结果: