双链表C语言实现
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
struct node *prev;
}node_t;
typedef struct list {
struct node head;
struct node tail;
}list_t;
void list_init(list_t *list)
{
list->head.next = &list->tail;
list->tail.prev = &list->head;
list->head.prev = NULL;
list->tail.next = NULL;
}
int list_empty(list_t *list)
{
return list->head.next == &list->tail;
}
int list_size(list_t *list)
{
int count = 0;
for(node_t *pnode = &list->head;
pnode != &list->tail;
pnode = pnode->next) {
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid != &list->tail)
count++;
}
return count;
}
static node_t *create_node(int data)
{
node_t *p = (node_t *)malloc(sizeof(node_t));
p->next = NULL;
p->prev = NULL;
p->data = data;
return p;
}
static void insert_data(node_t *pfirst, node_t *pmid, node_t *pnode)
{
pfirst->next = pnode;
pnode->prev = pfirst;
pnode->next = pmid;
pmid->prev = pnode;
}
void list_add_tail(list_t *list, int data)
{
node_t *pnode = create_node(data);
node_t *pfirst = list->tail.prev;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
insert_data(pfirst, pmid, pnode);
}
void list_add_head(list_t *list, int data)
{
node_t *pnode = create_node(data);
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
insert_data(pfirst, pmid, pnode);
}
void list_add(list_t *list, int data)
{
node_t *pnode = create_node(data);
for(node_t *ptmp = &list->head;
ptmp != &list->tail;
ptmp = ptmp->next) {
node_t *pfirst = ptmp;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid->data > pnode->data || pmid == &list->tail) {
insert_data(pfirst, pmid, pnode);
break;
}
}
}
static void del_data(node_t *pfirst, node_t *pmid, node_t *plast)
{
pfirst->next = plast;
plast->prev = pfirst;
free(pmid);
pmid = NULL;
}
void list_del_tail(list_t *list)
{
if(list->head.next == &list->tail) {
printf("list is empty.\n");
return;
}
node_t *plast = &list->tail;
node_t *pmid = plast->prev;
node_t *pfirst = pmid->prev;
del_data(pfirst, pmid, plast);
}
void list_del_head(list_t *list)
{
if(list_empty(list)) {
printf("list is empty.\n");
return;
}
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
del_data(pfirst, pmid, plast);
}
void list_del(list_t *list, int data)
{
for(node_t *pnode = &list->head;
pnode != &list->tail;
pnode=pnode->next) {
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid->data == data && pmid != &list->tail) {
del_data(pfirst, pmid, plast);
return;
}
}
printf("the data isn't exist\n");
}
int list_get_tail(list_t *list)
{
if(list_empty(list))
return -1;
node_t *plast = &list->tail;
node_t *pmid = plast->prev;
node_t *pfirst = pmid->prev;
return pmid->data;
}
int list_get_head(list_t *list)
{
if(list_empty(list))
return -1;
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
return pmid->data;
}
int list_get(list_t *list, int index)
{
int count = 0;
for(node_t *pnode = &list->head;
pnode != &list->tail;
pnode=pnode->next) {
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(count == index && pmid != &list->tail) {
return pmid->data;
}
count++;
}
return -1;
}
void list_show(list_t *list)
{
if(list_empty(list)){
printf("list is empty\n");
return;
}
for(node_t *pnode = &list->head;
pnode != &list->tail;
pnode = pnode->next){
node_t *pfirst = pnode;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
if(pmid != &list->tail)
printf("%d ",pmid->data);
}
putchar('\n');
}
void list_deinit(list_t *list)
{
while(list->head.next != &list->tail) {
node_t *pfirst = &list->head;
node_t *pmid = pfirst->next;
node_t *plast = pmid->next;
pfirst->next = plast;
plast->prev = pfirst;
free(pmid);
pmid = NULL;
}
}
void main(int argc,char *argv[])
{
list_t list;
list_init(&list);
list_add_head(&list,30);
list_add_head(&list,20);
list_add_head(&list,10);
list_add_tail(&list,40);
list_add_tail(&list,50);
list_add_tail(&list,60);
list_show(&list);
if(list_empty(&list)){
printf("list is empty\n");
}
printf("the size of list is %d\n",list_size(&list));
list_add(&list,45);
list_show(&list);
list_del_head(&list);
list_show(&list);
list_del_tail(&list);
list_show(&list);
list_del(&list,45);
list_show(&list);
printf("the data in first is %d\n",list_get_head(&list));
printf("the data in end is %d\n",list_get_tail(&list));
printf("the appointed node number data is %d\n",list_get(&list,0));
list_deinit(&list);
list_show(&list);
return;
}