數據結構--雙鏈表

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;
}

運行結果
在這裏插入圖片描述