本文用C语言实现了双向链表的create 创建、display 遍历、search 查找节点、del 删除节点、insert 插入节点,实现及测试程序如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct dlink
{
int num;
struct dlink *prior;
struct dlink *next;
}NODE;
NODE *create(int n)
{
NODE *pf = NULL, *pb = NULL, *head = NULL;
int i = 0;
for(i=0; i<n; i++)
{
pb = (NODE *)malloc(sizeof(NODE));
printf("please input num:\n");
scanf("%d", &pb->num);
if(i == 0)
{
head = pb;
pb->next = NULL;
pb->prior = NULL;
pf = pb;
}
else
{
pf->next = pb;
pb->prior = pf;
pf = pb;
}
}
pf->next = NULL;
return head;
}
void display(NODE *head)
{
NODE *pb = head;
while(pb->next != NULL)
{
printf("%d ", pb->num);
pb = pb->next;
}
printf("%d\n", pb->num);
}
NODE *search(NODE *head, int data)
{
NODE *mov = head;
while(mov != NULL)
{
if(mov->num == data)
{
printf("%d\n", mov->num);
return head;
}
mov = mov->next;
}
printf("node not found!\n");
return head;
}
NODE *del(NODE *head, int data)
{
NODE *pf = head, *pb = head;
while(pb->next!=NULL && pb->num!=data)
{
pf = pb;
pb = pb->next;
}
if(pb->num == data)
{
if(pb == head)
{
pb->next->prior = NULL;
head = pb->next;
}
else
{
if(pb->next == NULL)
pf->next = NULL;
else
{
pf->next = pb->next;
pb->next->prior = pf;
}
}
free(pb);
}
return head;
}
NODE *insert(NODE *head, int data)
{
NODE *pi, *pb = head, *pf = head;
pi = (NODE *)malloc(sizeof(NODE));
pi->num = data;
if(pb == NULL)
{
head = pi;
pi->next = NULL;
pi->prior = NULL;
return head;
}
while(pb->next!=NULL && pb->num < pi->num)
{
pf = pb;
pb = pb->next;
}
if(pb->num >= pi->num)
{
if(pb == head)
{
pi->next = pb;
pb->next->prior = pi;
head = pi;
pi->prior = NULL;
return head;
}
else
{
pf->next = pi;
pi->prior = pf;
pi->next = pb;
pb->prior = pi;
return head;
}
}
else
{
pb->next = pi;
pi->prior = pb;
pi->next = NULL;
}
return head;
}
int main(int argc, char *argv[])
{
NODE *head = NULL;
head = create(5);
display(head);
head = search(head, 3);
head = del(head, 3);
head = search(head, 3);
head = insert(head, 3);
head = search(head, 3);
return 0;
}