1. 程式人生 > >資料結構--雙鏈表

資料結構--雙鏈表

文章目錄

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

執行結果

在這裡插入圖片描述