#ifndef HEAD
#define HEAD
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct person {
char name[32];
char sex;
int age;
int score;
}DATATYPE;
typedef struct DulNode
{
DATATYPE date;
struct DulNode *prv;
struct DulNode *next;
}DulNode;
typedef struct DulLink
{
DulNode * head;
int clen;
}DulLinkList;
extern DulLinkListCreateDulList();
extern int InsertHeadDouLinkList(DulLinkList * l,DATATYPE * data);
extern int ShowDulLinkList(DulLinkList * l,int dir);// 0 zheng 1 fan
extern int InsertPosDouLinkList(DulLinkList * l,DATATYPE * data,int pos);
extern DulNode FindDulLinkList(DulLinkList * l,char* name);
extern int ModifyDulLinkList(DulLinkList * l,char* name,DATATYPE* data);
extern int DelDulLinkList(DulLinkList * l,char* name);
extern int InsertTailDouLinkList(DulLinkList * l,DATATYPE * data);
extern int DestroyLinkList(DulLinkList * l);
#endif // HEAD
#include “head.h”
int main(void)
{
DulLinkList* list = CreateDulList();
DATATYPE data[]={
{“zhangsan”,‘M’,22,80},
{“lisi”,‘F’,23,81},
{“wangmazi”,‘M’,24,82},
{“guanerge”,‘M’,54,88},
{“caocao”,‘M’,55,89},
};
InsertHeadDouLinkList(list,&data[0]);
InsertHeadDouLinkList(list,&data[1]);
InsertHeadDouLinkList(list,&data[2]);
ShowDulLinkList(list,0);
printf("---------------------------fan\n");
ShowDulLinkList(list,1);
printf("---------------------------pos\n");
/* InsertPosDouLinkList(list,&data[3],0);
ShowDulLinkList(list,0);
printf("---------------------------fan\n");
ShowDulLinkList(list,1);
printf("---------------------------find\n");*/
InsertTailDouLinkList(list,&data[3]);
ShowDulLinkList(list,0);
printf("---------------------------fan\n");
ShowDulLinkList(list,1);
printf("---------------------------find\n");
DelDulLinkList(list,"zhangsan");
DelDulLinkList(list,"lisi");
DelDulLinkList(list,"wangmazi");
DelDulLinkList(list,"guanerge");
//ShowDulLinkList(list,1);
DestroyLinkList(list);
printf("---------------------------destory\n");
//ShowDulLinkList(list,0);
/* DulNode* f_node = FindDulLinkList(list,“zhangsan1”);
if(f_node)
{
printf(“find this guy…%s\n”,f_node->date.name);
}
else
{
printf(“can’t find this guy…\n”);
}
printf("---------------------------modify\n");
ModifyDulLinkList(list,“guanerge”,&data[4]);
ShowDulLinkList(list,0);
printf("---------------------------fan\n");
ShowDulLinkList(list,1);
printf("----------------------del\n");
DelDulLinkList(list,“lisi”);
ShowDulLinkList(list,0);
printf("---------------------------fan\n");
ShowDulLinkList(list,1);*/
printf("Hello World!\n");
return 0;
}
#include “head.h”
DulLinkList*CreateDulList()
{
DulLinkList * temp = malloc(sizeof(DulLinkList));
if(NULL == temp)
{
perror("create dul list malloc");
return NULL;
}
temp->head = NULL;
temp->clen = 0 ;
return temp;
}
int InsertHeadDouLinkList(DulLinkList * l,DATATYPE * data)
{
DulNode* newnode = malloc(sizeof(DulNode));
if(NULL == newnode)
{
perror("InsertHeadDouLinkList malloc");
return 1;
}
newnode->next = NULL;
newnode->prv =NULL;
memcpy(&newnode->date,data,sizeof(DATATYPE));
if(NULL == l->head)
{
l->head = newnode;
}
else
{
newnode->next = l->head;
l->head->prv = newnode;
l->head = newnode;
}
l->clen++;
return 0;
}
int ShowDulLinkList(DulLinkList * l,int dir)// 0 zheng 1 fan
{
DulNode* temp = l->head;
if(0 == dir)
{
int i = 0 ;
for(i = 0 ;i<l->clen;i++)
{
printf("%s:%d\n",temp->date.name,temp->date.score);
temp= temp->next;
}
}
else
{
while(temp->next)
{
temp= temp->next;
}
while(temp)
{
printf("%s:%d\n",temp->date.name,temp->date.score);
temp = temp->prv;
}
}
return 0;
}
int InsertTailDouLinkList(DulLinkList * l,DATATYPE * data)
{
DulNode * temp = l->head;
while(temp->next)
{
temp =temp->next;
}
DulNode *newnode = malloc(sizeof(DulNode));
if(NULL == newnode)
{
fprintf(stderr, "InsertTailDouLinkList malloc error\n");
return 1;
}
memcpy(&newnode->date,data,sizeof(DATATYPE));
temp->next = newnode;
newnode->prv = temp;
newnode->next = NULL;
l->clen ++;
return 0;
}
int InsertPosDouLinkList(DulLinkList * l,DATATYPE * data,int pos)
{
if(0 == pos)
{
InsertHeadDouLinkList(l,data);
}
else if(pos == l->clen)
{
InsertTailDouLinkList(l,data);
}
else
{
DulNode* newnode = malloc(sizeof(DulNode));
if(NULL == newnode)
{
perror("InsertPosDouLinkList malloc");
return 1;
}
memcpy(&newnode->date,data,sizeof(DATATYPE));
newnode->next = NULL;
newnode->prv = NULL;
DulNode* temp = l->head;
int i = 0 ;
for(i = 0 ;i<pos;i++)
{
temp=temp->next;
}
newnode->next = temp;
newnode->prv = temp->prv;
temp->prv->next = newnode;
temp->prv = newnode;
l->clen++;
}
return 0;
}
DulNode* FindDulLinkList(DulLinkList * l,char* name)
{
int i = 0 ;
DulNode* temp = l->head;
for(i= 0 ;i<l->clen;i++)
{
if(0 == strcmp(temp->date.name,name))
{
return temp;
}
temp= temp->next;//temp++;
}
return NULL;
}
int ModifyDulLinkList(DulLinkList * l,char* name,DATATYPE* data)
{
DulNode* temp = FindDulLinkList(l,name);
if(temp)
{
memcpy(&temp->date,data,sizeof(DATATYPE));
return 0;
}
else
{
fprintf(stderr,"ModifyDulLinkList node failure...\n");
return 1;
}
}
//have bug is one dulnode ,
int DelDulLinkList(DulLinkList * l,char* name)
{
DulNode* temp = FindDulLinkList(l,name);
if(NULL == temp)
{
fprintf(stderr,"DelDulLinkList failure... %s\n",name);
return 1;
}
else
{
if(temp == l->head)
{
//error code
/* l->head = temp->next;
l->head->prv = NULL;
free(temp); */
//modifi bug
if(NULL== temp->next)
{
free(temp);
l->head = NULL;
}
else
{
l->head = temp->next;
l->head->prv = NULL;
free(temp);
}
}
else if(NULL==temp->next)
{
temp->prv->next = NULL;
free(temp);
}
else
{
temp->next->prv = temp->prv;
temp->prv->next = temp->next;
free(temp);
}
}
l->clen--;
return 0;
}
int DestroyLinkList(DulLinkList * l)
{
if(NULL == l->head)
{
// fprintf(stderr, "not can Destroy");
free(l);
}
else
{
DulNode * temp = l->head;
while(temp->next)
{
l->head = temp->next;
temp = temp->next;
free(temp->prv);
temp->prv = NULL;
}
free(temp);
l->head =NULL;
free(l);
}
return 0;
}