double_linklist.h
#ifndef __DOUBLE_LINKLIST_H__ #define __DOUBLE_LINKLIST_H__ #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct dnode{ datatype data; struct dnode *prior; struct dnode *next; }dlistnode,*dlinklist; dlinklist create_n_c_dlinklist(void); int delete_pos_c_dlinklist(dlinklist L,int pos); void clear_c_dlinklist(dlinklist L); dlinklist get_list_pos_c_dlinklist(dlinklist L,int pos); int insert_pos_c_dlinklist(dlinklist L,datatype x,int pos); void show_dlinklist(dlinklist L); #endif
double_linklist.c
#include "double_linklist.h" dlinklist create_n_c_dlinklist(void) { int n=0; dlinklist K,H,r; if((K = (dlinklist)malloc(sizeof(dlistnode))) == NULL) { printf("malloc no memmory!\n"); return NULL; } K->next = K; K->prior = K; r = K; while(1) { printf("Please input a number (-1 exit:"); while(scanf("%d",&n) != 1) { printf("Please input a number (-1 exit:"); getchar(); } if(n == -1)break; if((H = (dlinklist)malloc(sizeof(dlistnode))) == NULL) { printf("malloc no memmory!\n"); return K; } H->data = n; H->prior = r; H->next = K; r->next = H; K->prior = H; r = H; } return K; } int delete_pos_c_dlinklist(dlinklist L,int pos) { dlinklist r; if((r = get_list_pos_c_dlinklist(L,pos)) == NULL) { return -1; } r->prior->next = r->next; r->next->prior = r->prior; r->next = NULL; r->prior = NULL; free(r); r = NULL; return 0; } void clear_c_dlinklist(dlinklist L) { if(L == NULL) { printf("list is NULL!\n"); return ; } while(delete_pos_c_dlinklist(L,0) == 0); //L->next = NULL; //L->prior = NULL; free(L); L = NULL; return ; } dlinklist get_list_pos_c_dlinklist(dlinklist L,int pos) { int i=-1; dlinklist r; if(L == NULL) { printf("list is NULL!\n"); return NULL; } if(pos < 0) { printf("error: pos < 0!\n"); return NULL; } r = L; while(i< pos) { r = r->next; i++; if(r == L) { printf("pos over the list length!\n"); return NULL; } } return r; } int insert_pos_c_dlinklist(dlinklist L,datatype x,int pos) { dlinklist H,r; if((r = get_list_pos_c_dlinklist(L,pos)) == NULL) { return -1; } if((H = (dlinklist)malloc(sizeof(dlistnode))) == NULL) { printf("malloc no memmory!\n"); return -1; } H->data = x; H->prior = r->prior; H->next = r; r->prior->next = H; r->prior = H; return 0; } void show_dlinklist(dlinklist L) { dlinklist r; if(L == NULL) { printf("list is NULL!\n"); return ; } r = L->next; if(r == L) { printf("list is NULL!\n"); return ; } while(r != L) { printf("%d\t",r->data); r = r->next; } puts(""); return ; }
main.c
#include "double_linklist.h" int main(int argc, const char *argv[]) { int n=0; dlinklist H=NULL; show_dlinklist(H); H=create_n_c_dlinklist(); printf("%p\t%p\t%p\n",H->prior,H,H->next); show_dlinklist(H); while(1) { printf("Please input a pos (-1 exit:"); while(scanf("%d",&n) != 1) { getchar(); printf("Please input a pos (-1 exit:"); } if(n == -1)break; delete_pos_c_dlinklist(H,n); show_dlinklist(H); } clear_c_dlinklist(H); printf("%p\t%p\t%p\n",H->prior,H,H->next); show_dlinklist(H); return 0; }
運行結果