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);
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;
}
运行结果