双向链表的增删改查,此双向链表没有使用空的头链表,直接第一个链表就可以存值。
//cat chapter2_doublelink.h
#ifndef _DOUBLE_LINK_
#define _DOUBLE_LINK_
typedef struct GList {
int data;
struct GList *prev;
struct GList *next;
} GList;
GList * g_list_new(void);
int g_list_free(GList * p1);
GList * g_list_preinsert(GList * p1, GList* p2);
GList * g_list_appand(GList *p1, GList * p2);
int g_list_print_all(const GList *p1);
GList * g_list_get_post_link(const GList *p1, int pos);
int g_list_post_insert(GList **head, int pos, GList *p2);
GList * g_list_del_link(GList * p1, GList *p2);
void * g_list_destroy(GList * p1);
#endif
root@ubuntu:data-struct# cat double_link.c
#include "chapter2_doublelink.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
GList * g_list_new(void)
{
GList * p1 = NULL;
p1 = malloc(sizeof(GList));
if (p1) {
p1->prev = p1;
p1->next = p1;
p1->data = 0;
}
return p1;
}
int g_list_free(GList * p1)
{
if (p1) {
free(p1);
return 0;
}
else {
return -1;
}
}
GList * g_list_preinsert(GList * p1, GList* p2)
{
if ( p1 ) {
p2->next = p1;
p2->prev = p1->prev;
p1->prev->next = p2;
p1->prev = p2;
}
return p2;
}
GList * g_list_appand(GList *p1, GList * p2)
{
if (p1) {
p2->next = p1;
p2->prev = p1->prev;
p1->prev->next = p2;
p1->prev = p2;
return p1;
}
else {
return p2;
}
}
GList * g_list_del_link(GList * p1, GList *p2)
{
int i = 0;
GList *p3 = p1;
while (p3) {
if (i != 0 && p3 == p1) {
break;
}
i++;
if (p3->data == p2->data) {
if (p3->next == p3) {
g_list_free(p3);
return NULL;
}
else {
p3->prev->next = p3->next;
p3->next->prev = p3->prev;
if (i == 1) {
p1 = p3->next;
}
g_list_free(p3);
return p1;
}
}
else {
p3 = p3->next;
}
}
return p1;
}
void * g_list_destroy(GList * p1)
{
if (p1) {
GList *p2 = p1;
GList *p3 = p2->next;
while (p2) {
g_l