list.h
#include<stdlib.h>
#include<stdio.h>
typedef struct node
{
int data;
struct node *pPre;
struct node *pNext;
}NODE, *PNODE;
//双链表的头尾
typedef struct List
{
struct node *head;
struct node *tail;
}Dlist;
void init(Dlist *p);
void adddataback(Dlist *p, int data);
void showall(Dlist *p);
void adddatahead(Dlist *p, int data);
PNODE find(Dlist *p, int data);
void change(Dlist *p, int data,int newdata);
void deletedata(Dlist *p, int data);
void inserthead(Dlist *p, int data, int newdata);
void insertback(Dlist *p, int data, int newdata);
list.c
#include"list.h"
void init(Dlist *p)
{
p->head = p->tail = NULL;//初始化
}
void adddataback(Dlist *p, int data)
{
PNODE pnew = malloc(sizeof(NODE));
pnew->data = data;
pnew->pNext = NULL;
pnew->pPre = NULL;
if (p->head==NULL &&p->tail==NULL)
{
p->tail = p->head = pnew;
pnew->pPre = pnew->pNext = pnew;//插入一个节点
}
else if (p->head==p->tail)//仅有一个节点
{
p->head->pPre = pnew;
p->head->pNext = pnew;
pnew->pPre = p->head;
pnew->pNext = p->head;
p->tail = pnew;//保存尾部
}
else
{
pnew->pPre = p->tail;
pnew->pNext = p->head;
p->tail->pNext = pnew;
p->head->pPre = pnew;
p->tail = pnew;
}
}
void showall(Dlist *p)
{
if (p->head==NULL&&p->tail==NULL)
{
return;
}
else if(p->head==p->tail)
{
PNODE p1 = p->head;
printf("%d %p %p %p\n", p1->data, p1, p1->pPre, p1->pNext);
}
else
{
PNODE p2 = p->head;
for (; p2->pNext!=p->head; p2=p2->pNext)
{
printf("%d %p %p %p\n", p2->data, p2, p2->pPre, p2->pNext);
}
printf("%d %p %p %p\n", p2->data, p2, p2->pPre, p2->pNext);
}
}
void adddatahead(Dlist *p, int data)
{
PNODE pnew=malloc(sizeof(NODE));
pnew->data = data;
pnew->pNext = NULL;
pnew->pPre = NULL;
if (p->head==NULL&&p->tail==NULL)
{
p->head = p->tail = pnew;
pnew->pNext = pnew;
pnew->pPre = pnew;
}
else if(p->head==p->tail)
{
p->head->pNext = pnew;
pnew->pNext = p->head;
p->tail->pPre = pnew;
pnew->pPre = p->tail;
p->head = pnew;
}
else
{
p->head->pPre = pnew;
pnew->pPre = p->tail;
p->tail->pNext = pnew;
pnew->pNext = p->head;
p->head = pnew;
}
}
PNODE find(Dlist *p, int data)
{
if (p->head==NULL&&p->tail==NULL)
{
return NULL;
}
else if (p->head==p->tail)
{
if (p->head->data == data) {
return p->head;
}
else
{
return NULL;
}
}
else
{
PNODE pnew = p->head;
while (pnew->pNext!=p->head)
{
if (pnew->data == data)
{
return pnew;
}
else
{
pnew = pnew->pNext;
}
}
if (pnew->data == data)
{
return pnew;
}
else
{
return NULL;
}
}
}
void change(Dlist *p, int data, int newdata)
{
if (p->head == NULL && p->tail == NULL)
{
printf("change error");
}
else if (p->head == p->tail)
{
if (p->head->data == data)
{
p->head->data=newdata;
}
}
else
{
PNODE pnew = p->head;
while (pnew->pNext != p->head)
{
if (pnew->data == data)
{
pnew->data=newdata;
break;
}
else
{
pnew = pnew->pNext;
}
}
if (pnew->data == data)
{
pnew->data = newdata;
}
}
}
void deletedata(Dlist *p, int data)
{
if (p->head==NULL&&p->tail==NULL)
{
printf("delete error");
}
else if (p->head==p->tail)
{
if (p->head->data==data)
{
free(p->head);
}
}
else
{
PNODE p1=p->head;
if (p1->data == data)
{
p->head->pPre->pNext = p->head->pNext;
p->head->pNext->pPre = p->head->pPre;
p->head = p->head->pNext;
free(p1);
return;
}
PNODE p2 = NULL;
while (p1->pNext!=p->head)
{
if (p1->data == data)
{
p2->pNext = p1->pNext;
p1->pNext->pPre = p2;
free(p1);
return;
}
else
{
p2 = p1;
p1 = p1->pNext;
}
}
if (p1->data == data)
{
p2->pNext = p1->pNext;
p1->pNext->pPre = p2;
p->tail = p1->pPre;
free(p1);
return;
}
}
}
void inserthead(Dlist *p, int data, int newdata)
{
PNODE pnew = malloc(sizeof(NODE));
pnew->data = newdata;
pnew->pNext = NULL;
pnew->pPre = NULL;
if (p->head==NULL&&p->tail==NULL)
{
printf("inserthead error");
}
else if (p->head==p->tail)
{
if (p->head->data==data)
{
pnew->pNext = p->head;
pnew->pPre = p->head;
p->head->pNext = pnew;
p->head->pPre = pnew;
p->head = pnew;
p->tail = pnew->pPre;
}
}
else
{
PNODE p1 =p->head, p2 = p1->pPre;
while (p1->pNext!=p->head)
{
if (p1->data==data)
{
pnew->pNext = p1;
pnew->pPre = p2;
p2->pNext = pnew;
p1->pPre = pnew;
p->head = pnew;
return;
}
else
{
p2 = p1;
p1 = p1->pNext;
}
}
if (p1->data == data)
{
pnew->pNext = p1;
pnew->pPre = p2;
p2->pNext = pnew;
p1->pPre = pnew;
return;
}
}
}
void insertback(Dlist *p, int data, int newdata)
{
PNODE pnew = malloc(sizeof(NODE));
pnew->data = newdata;
pnew->pPre = NULL;
pnew->pPre = NULL;
if (p->head==NULL&&p->tail==NULL)
{
printf("insertback error");
}
else if(p->head==p->tail)
{
if (p->head->data==data)
{
p->head->pNext = pnew;
pnew->pNext = p->tail;
p->tail->pPre = pnew;
pnew->pPre = p->head;
p->tail = pnew;
}
}
else
{
PNODE p1 = p->head,p2=p1->pNext;
while (p1->pNext!=p->head)
{
if (p1->data == data)
{
p1->pNext = pnew;
pnew->pNext = p2;
p2->pPre = pnew;
pnew->pPre = p1;
return;
}
else
{
p1 = p2;
p2 = p2->pNext;
}
}
if (p1->data == data)
{
p1->pNext = pnew;
pnew->pNext = p2;
p2->pPre = pnew;
pnew->pPre = p1;
p->tail = pnew;
return;
}
}
}
main.c
#include"list.h"
void main()
{
Dlist dlist;
init(&dlist);
adddataback(&dlist, 1);
adddatahead(&dlist, 5);
adddatahead(&dlist, 6);
adddatahead(&dlist, 7);
adddatahead(&dlist, 8);
printf("\n\n\n");
showall(&dlist);
deletedata(&dlist, 1);
printf("\n\n\n");
showall(&dlist);
inserthead(&dlist, 8, 9);
printf("\n\n\n");
showall(&dlist);
insertback(&dlist, 8, 10);
printf("\n\n\n");
showall(&dlist);
system("pause");
}