DLinkList.h头文件 #ifndef DLINKLIST_H_H #define OK 0 #define ERROR -1 typedef int type; typedef struct DLNode { type elem; struct DLNode *prior; struct DLNode *next; }*DLinkList, DLNode; int init_dlinkList(DLinkList*); int create_dlinkList(DLinkList); int print_dlinkList_forward(DLinkList); int print_dlinkList_backward(DLinkList); int length_linkList(DLinkList); int insert_dlinkList(DLinkList, int, type); int get_elem(DLinkList, int, DLNode**); int delete_linkList(DLinkList, type, type*); int clear_dlinkList(DLinkList); int destroy_dlinkList(DLinkList*); #endif DLinkList.cpp文件 #include "DLinkList.h" #include <stdio.h> #include <stdlib.h> int make_node(DLNode **node) { if(!((*node) = (DLNode*)malloc(sizeof(DLNode)))) return ERROR; return OK; } //initial circulate double linklist int init_dlinkList(DLinkList *dlist) { if(!(*dlist = (DLinkList)malloc(sizeof(DLNode)))) return ERROR; (*dlist)->next = *dlist; (*dlist)->prior = *dlist; (*dlist)->elem = 0; return OK; } //create circulate double linklist int create_dlinkList(DLinkList dlist) { if(dlist == NULL) return ERROR; type num; DLNode *node; DLNode *tmp = dlist; printf("input num: "); scanf("%d",&num); while(num != 0) { if(make_node(&node)) return ERROR; node->elem = num; node->prior = tmp; node->next = tmp->next; tmp->next = node; tmp = node; node = NULL; dlist->elem++; scanf("%d",&num); } dlist->prior = tmp; tmp->next = dlist; return OK; } int print_dlinkList_forward(DLinkList dlist) { if(dlist == NULL || dlist->next == dlist) return ERROR; DLNode *tmp = dlist->next; while(tmp->next != dlist) { printf("%d ",tmp->elem); tmp = tmp->next; } printf("%d/n",tmp->elem); return OK; } int print_dlinkList_backward(DLinkList dlist) { if(dlist == NULL || dlist->next == dlist) return ERROR; DLNode *tmp = dlist->prior; while(tmp->prior != dlist) { printf("%d ",tmp->elem); tmp = tmp->prior; } printf("%d/n",tmp->elem); return OK; } int length_linkList(DLinkList dlist) { if(dlist->next == NULL || dlist == NULL) return 0; return dlist->elem; } int get_elem(DLinkList dlist, int i, DLNode **e) { if(dlist->next == dlist || dlist == NULL) return ERROR; if(i < 0 || i >= dlist->elem) return ERROR; DLNode *tmp = dlist; while((i--) >= 0) { tmp = tmp->next; } *e = tmp; return OK; } int insert_dlinkList(DLinkList dlist, int i, type e) { if(dlist == NULL) return ERROR; if(i < 0 || i > dlist->elem) return ERROR; DLNode *node; if(make_node(&node)) return ERROR; node->elem = e; if(0 == i) { node->next = dlist->next; node->prior = dlist; dlist->next->prior = node; dlist->next = node; } else if(dlist->elem == i) { DLNode *tmp = dlist; tmp = tmp->prior; node->next = tmp->next; node->prior = tmp; tmp->next->prior = node; tmp->next = node; } else { DLNode *tmp = dlist; while((i--) > 0) { tmp = tmp->next; } node->next = tmp; node->prior = tmp->prior; tmp->prior->next = node; tmp->prior = node; } dlist->elem++; return OK; } int delete_linkList(DLinkList dlist, type v, type *e) { if(dlist == NULL || dlist->next == NULL) return ERROR; DLNode *tmp = dlist->next; DLNode *tmp1 = NULL; while(tmp != dlist && tmp->elem != v) { tmp = tmp->next; } *e = tmp->elem; tmp1 = tmp->prior; tmp->next->prior = tmp1; tmp1->next = tmp->next; free(tmp); dlist->elem--; return OK; } int clear_dlinkList(DLinkList dlist) { if(dlist == NULL || dlist->next == NULL) return ERROR; DLNode *tmp = dlist->next; DLNode *tmp1 = NULL; while(tmp != dlist) { tmp1 = tmp; tmp = tmp->next; free(tmp1); } dlist->elem = 0; dlist->next = dlist; dlist->prior = dlist; return OK; } int destroy_dlinkList(DLinkList *dlist) { if(dlist == NULL) return ERROR; clear_dlinkList(*dlist); free(*dlist); (*dlist) = NULL; return OK; }