C语言双链表
#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *prev;
struct node *next;
}st,*pt;
pt node_init(void);
void add_head(pt head,int data);
void add_tail(pt head,int data);
void del_node(pt head,int data);
void show(pt head);
int main(int argc, char const *argv[])
{
int data;
pt head = node_init();
while(1)
{
printf("请输入:");
scanf("%d",&data);
if(data > 0)
{
add_head(head,data);
}
else if(data < 0)
{
del_node(head,-data);
}
else
break;
show(head);
}
return 0;
}
pt node_init(void)
{
pt head = (pt)malloc(sizeof(st));
if(head == NULL)
{
perror("init failed");
return NULL;
}
head->prev = NULL;
head->next = NULL;
return head;
}
void add_head(pt head,int data)
{
pt new_node = node_init();
new_node->data = data;
if(new_node == NULL)
{
perror("new_node failed");
return;
}
if(head->next == NULL)
{
head->next = new_node;
new_node->prev = head;
return ;
}
new_node->prev = head;
new_node->next = head->next;
head->next = new_node;
new_node->next->prev = new_node;
printf("插入成功\n");
}
void add_tail(pt head,int data)
{
pt new_node = node_init();
if(new_node == NULL)
{
perror("new_node failed");
return;
}
pt pos = head;
while(pos->next != NULL)
{
pos = pos->next;
}
new_node->data = data;
new_node->next = NULL;
new_node->prev = pos;
pos->next = new_node;
printf("插入成功\n");
}
void del_node(pt head,int data)
{
pt pos = head->next;
pt tmp;
int flag = 0;
while(pos->next != NULL)
{
if(pos->data == data)
{
flag++;
tmp = pos;
pos = pos->prev;
tmp->prev->next = tmp->next;
tmp->next->prev = tmp->prev;
tmp->next = NULL;
tmp->prev = NULL;
free(tmp);
}
pos = pos->next;
}
if(pos->data == data)
{
pos->prev->next = NULL;
pos->prev = NULL;
flag++;
free(pos);
}
printf("删除%d个\n",flag);
}
void show(pt head)
{
pt pos = head->next;
printf("****\n");
while(pos != NULL)
{
printf("%d\n", pos->data);
pos = pos->next;
}
}