//duolist.c
#include <stdlib.h>
#include <stdio.h>
//wuy@farsight.cn
//
// 类型
typedef struct node{
int data;
struct node * front;
struct node * next;
}duolist_t;
//
// 创建
duolist_t* create_duolist()
{duolist_t* list=malloc(sizeof(duolist_t));
list->front=NULL;
list->next=malloc(sizeof(duolist_t));
list->next->front=list;
list->next->next=NULL;
return list;
}
// 判空
int isnull(duolist_t* list)
{if(list==NULL)
return 0;
return list->next->next==NULL;
}
// 插入
int insert_duolist(duolist_t* list,int data)
{
//1
if(list==NULL)
return -1;
//2
duolist_t* newnode=malloc(sizeof(duolist_t));
newnode->data=data;
//3
newnode->front=list;
newnode->next=list->next;
//4
newnode->front->next=newnode;
newnode->next->front=newnode;
return 0;
}
// 删除
//
int delete_duolist(duolist_t* list)
{
//1
if(list==NULL||isnull(list))
return -1;
//2
duolist_t* temp=list->next;
//3
temp->front->next=temp->next;
temp->next->front=temp->front;
//4
free(temp);
return 0;
}
// 查找 返回查找到节点的 地址(非前一个)可以使用 ->front 来定位前一个
duolist_t* locate_duolist(duolist_t* list,int data)
{if(list==NULL||isnull(list))
return NULL;
while(list->next->next!=NULL)
{if(list->next->data==data)
return list->next;
list=list->next;
}
return NULL;
}
//
int change_duolist(duolist_t* list, int data)
{if(list==NULL)
return -1;
list->data=data;
return 0;
}
// 打印
int print_duolist(duolist_t* list)
{if(list==NULL||isnull(list))
return -1;
while(list->next->next!=NULL)
{printf("%3d",list->next->data);
list=list->next;
}
printf("\n");
return 0;
}
// 逆打印
int reprint_duolist(duolist_t* list)
{if(list==NULL||isnull(list))
return -1;
while(list->next->next!=NULL)
{list=list->next;}
// 在尾节点 前一个节点
list=list->next;
while(list->front->front!=NULL)
{printf("%3d",list->front->data);
list=list->front;
}
printf("\n");
return 0;
}
// 长度
int length_duolsit(duolist_t* list)
{if(list==NULL||isnull(list))
return 0;
int sum=0;
while(list->next->next!=NULL)
{
sum++;
list=list->next;
}
return sum;
}
// 清空
int clear_duolist(duolist_t* list)
{if(list==NULL||isnull(list))
return -1;
while(!isnull(list))
{delete_duolist(list);
}
return 0;
}
// 销毁
int destroy_duolist(duolist_t* list)
{if(list==NULL)
return -1;
if(!isnull(list))
clear_duolist(list);
free(list->next);
free(list);
return 0;
}
int main(int argc, const char *argv[])
{duolist_t* list=create_duolist();
int i;
for(i=1;i<=20;i++)
{insert_duolist(list,i);
print_duolist(list);
}
change_duolist(locate_duolist(list,15),250);
print_duolist(list);
insert_duolist(locate_duolist(list,250)->front,15);
print_duolist(list);
delete_duolist(locate_duolist(list,250)->front);
print_duolist(list);
reprint_duolist(list);
printf("length_duolsit:%d\n",length_duolsit(list));
clear_duolist(list);
printf("length_duolsit:%d\n",length_duolsit(list));
destroy_duolist(list);
#if 0
for(i=1;i<=20;i++)
{delete_duolist(list);
print_duolist(list);
}
#endif
return 0;
}