Makefile:
BIN = DoubleListDemo CC = gcc SRC = DoubleList.c main.c OBJS = DoubleList.o main.o CFLAGS = -Wall -O2 $(BIN): $(OBJS) $(CC) -o $(BIN) $(OBJS) $(CFLAGS) $(OBJS): $(SRC) gcc -c $(SRC) $(CFLAGS) clean: rm -rf *.o rm -rf $(BIN) distclean: -rm *.o
DoubleList.h
#include <stdio.h> #include <stdlib.h> typedef int KEY; typedef struct { KEY key; int date; }DATE; typedef struct node{ DATE date; struct node * pre; struct node * next; }NODE; typedef struct{ int num; NODE *head; NODE *tail; }DOUBLE_LIST; /**********************************************/ void InitDoubleList(DOUBLE_LIST *list); void DoubleListPrint(DOUBLE_LIST list); void PrintNode(NODE * node); void HeadInsterNode(DOUBLE_LIST *list, DATE date); void XInsterNode(DOUBLE_LIST *list, DATE date, int x); void TailInsterNode(DOUBLE_LIST *list, DATE date); void HeadDeleteNode(DOUBLE_LIST *list); void XDeleteNode(DOUBLE_LIST *list, KEY key); void TailDeleteNode(DOUBLE_LIST *list); void FreeList(DOUBLE_LIST *list);
DoubleList.c
#include "DoubleList.h" /**********************************************************/ void InitDoubleList(DOUBLE_LIST *list) { list->head = NULL; list->tail = NULL; list->num = 0; return ; } /**********************************************************/ void DoubleListPrint(DOUBLE_LIST list) { int i = 0; NODE * p = NULL; p = list.head; if(0 == list.num){ printf("Your List is Empty!\n"); return; } for(i = 0; i < list.num; i++){ PrintNode(p); p = p->next; } return; } /**********************************************************/ void PrintNode(NODE * node) { printf("key:%d\tdate:%d\n",node->date.key,node->date.date); return; } /**********************************************************/ void HeadInsterNode(DOUBLE_LIST * list, DATE date) { NODE * newnode = (NODE *)malloc(sizeof(NODE)); newnode->date.key = date.key; newnode->date.date = date.date; if(0 == list->num){ newnode->next = NULL; newnode->pre = NULL; list->head = newnode; list->tail = newnode; list->num++; return; } newnode->pre = NULL; newnode->next = list->head; list->head->pre = newnode; list->head = newnode; list->num++; return; } /**********************************************************/ void XInsterNode(DOUBLE_LIST *list, DATE date, int x) { int i; NODE * newnode = NULL; NODE * prenode = NULL; NODE * nextnode = NULL; if(x < 0 ||x >= list->num){ printf("X Inster: x is not right!\n"); return; } if(0 == x){ HeadInsterNode(list, date); return; } if(list->num == x - 1){ TailInsterNode(list, date); return; } prenode = NULL; nextnode = list->head; for(i = 0; i < x; i++){ prenode = nextnode; nextnode = nextnode->next; } newnode = (NODE *)malloc(sizeof(NODE)); newnode->date.key = date.key; newnode->date.date = date.date; prenode->next = newnode; newnode->pre = prenode; newnode->next = nextnode; nextnode->pre = newnode; list->num++; return ; } /**********************************************************/ void TailInsterNode(DOUBLE_LIST *list, DATE date) { NODE * newnode = (NODE *)malloc(sizeof(NODE)); newnode->date.key = date.key; newnode->date.date = date.date; if(0 == list->num){ newnode->next = NULL; newnode->pre = NULL; list->head = newnode; list->tail = newnode; list->num++; return; } newnode->next = NULL; newnode->pre = list->tail; list->tail->next = newnode; list->tail = newnode; list->num++; return; } /**********************************************************/ void HeadDeleteNode(DOUBLE_LIST *list) { NODE * tmpnode = NULL; if(0 == list->num ){ printf("%s:No Node In List!\n",__FUNCTION__); return; } if(1 == list->num){ free(list->head); list->head = NULL; list->tail = NULL; list->num = 0; return ; } tmpnode = list->head; list->head = list->head->next; free(tmpnode); tmpnode = NULL; list->num--; return ; } /**********************************************************/ void XDeleteNode(DOUBLE_LIST *list, KEY key) { ; } /**********************************************************/ void TailDeleteNode(DOUBLE_LIST *list) { NODE * tmpnode = NULL; if(0 == list->num ){ printf("%s:No Node In List!\n",__FUNCTION__); return; } if(1 == list->num){ free(list->head); list->head = NULL; list->tail = NULL; list->num = 0; return ; } tmpnode = list->tail; list->tail = list->tail->pre; list->tail->next = NULL; free(tmpnode); tmpnode = NULL; list->num--; return; } /**********************************************************/ void FreeList(DOUBLE_LIST *list) { int i; NODE * tmpnode = NULL; int num; num = list->num; for(i = 0; i < num; i++){ tmpnode = list->head; list->head = list->head->next; free(tmpnode); tmpnode = NULL; list->num--; } list->head = NULL; list->tail = NULL; return; }
main.c
#include "DoubleList.h" int main(int argc,char *argv[]) { DOUBLE_LIST list; int i; DATE date[10]; for(i = 0; i < 10; i++){ date[i].key = i + 1; date[i].date = i + 11; } #if 1 printf("init list test\n"); InitDoubleList(&list); DoubleListPrint(list); #endif #if 1 //Head inster test printf("head inster test\n"); HeadInsterNode(&list, date[0]); HeadInsterNode(&list, date[1]); HeadInsterNode(&list, date[2]); HeadInsterNode(&list, date[3]); HeadInsterNode(&list, date[4]); DoubleListPrint(list); #endif #if 1 //tail inster test printf("\ntail inster test\n"); TailInsterNode(&list, date[0]); TailInsterNode(&list, date[1]); TailInsterNode(&list, date[2]); TailInsterNode(&list, date[3]); TailInsterNode(&list, date[4]); DoubleListPrint(list); #endif #if 1 //x inster test printf("\nx inster test\n"); XInsterNode(&list, date[5], 5); XInsterNode(&list, date[6], 6); XInsterNode(&list, date[7], 7); XInsterNode(&list, date[8], 8); XInsterNode(&list, date[9], 9); DoubleListPrint(list); #endif #if 1 //head delete test printf("\nhead delete test\n"); HeadDeleteNode(&list); HeadDeleteNode(&list); HeadDeleteNode(&list); HeadDeleteNode(&list); HeadDeleteNode(&list); DoubleListPrint(list); #endif #if 1 //tail delete test printf("\ntail delete test\n"); TailDeleteNode(&list); TailDeleteNode(&list); TailDeleteNode(&list); TailDeleteNode(&list); TailDeleteNode(&list); DoubleListPrint(list); #endif #if 1 //free list test printf("\nfree list test\n"); FreeList(&list); DoubleListPrint(list); #endif return 0; }