數據結構:雙向鏈表的實現

帶頭結點,不帶頭結點的類似

#include <stdio.h>
#include <stdlib.h>

#define ElemType int

typedef struct DNode{
	ElemType data;
	struct DNode *prior; // 指向前驅結點 
	struct DNode *next;  // 指向後繼結點 
}DNode, *DLinkList; 
// 雙向鏈表的初始化 
bool InitDLinkList(DLinkList &L)
{
	L = (DNode *)malloc(sizeof(DNode)); // 建立頭結點 
	if(L == NULL) return false;	// 內存申請失敗 
	L->prior = NULL;
	L->next = NULL;
	return true; 
}
// 雙鏈表 查找指定idx位置的結點 
DNode* GetNode(DLinkList &L, int idx) 
{
	if(L == NULL){
		return NULL;
	}
	DNode *p = L;
	int j = 0;
	while(p->next != NULL && j < idx){ // 找到第idx個結點 
		p = p->next;
		j++;
	}
	return p;
}
// 雙鏈表在指定p結點之後插入s結點 
bool InsertNextNode(DNode *p, DNode *s)
{
	
	if(p == NULL || s == NULL){ // 非法參數 
		return false;
	}
	
	s->next = p->next;
	if(p->next != NULL){ // 如果p有後繼結點 
		p->next->prior = s;
	}
	s->prior = p;
	p->next = s;
	return true;
}
// 在指定位置插入結點p
bool ListInsert(DLinkList &L, int idx, DNode *p)
{
	if(idx < 1){
		return false;
	}

	DNode *s = GetNode(L, idx-1);	// 獲取第idx-1個結點 
	if(s == NULL){
		return false;
	}
//	printf("Here\n");
	return InsertNextNode(s, p); // 在第idx-1之後插入p結點 
}
// 雙鏈表 刪除指定P結點的後繼結點
bool DeleteNextNode(DNode *p)
{
	if(p == NULL || p->next == NULL){
		return false;
	}
	DNode *s = p->next; // 待刪除結點 
	if(s->next != NULL){
		s->next->prior = p;
	}
	p->next = s->next;
	free(s);
	return true;
}
// 銷燬雙鏈表
bool DestroyList(DLinkList &L) 
{
	while(L->next != NULL){
		DeleteNextNode(L);
	} 
	free(L);
	return true;
}

bool IsEmpty(DLinkList L)
{
	return (L->next == NULL ? true : false);
}
// 頭插法建立雙鏈表
DLinkList ListHeadInsert(DLinkList &L) 
{
	if(L != NULL){
		DestroyList(L);
	}
	L = (DNode *)malloc(sizeof(DNode));
	L->next = L->prior = NULL;
	
	ElemType e;
	while(scanf("%d", &e) != EOF){
		DNode *newnode = (DNode *)malloc(sizeof(DNode));
		newnode->data = e;
		newnode->next = L->next;
		if(L->next != NULL){ // 如果頭結點有後繼結點 
			L->next->prior = newnode;
		}
		newnode->prior = L;
		L->next = newnode;
	}
	return L;
}
// 尾插法建立雙鏈表
DLinkList ListTailInsert(DLinkList &L) 
{
//	if(L != NULL){
//		DestroyList(L);
//	}
//	L = (DNode *)malloc(sizeof(DNode));
//	L->prior = L->next = NULL;
	ElemType e;
	DNode *tail = L;
	while(tail->next != NULL){
		tail = tail->next;
	}
	while(scanf("%d", &e) != EOF){
		DNode *newnode = (DNode *)malloc(sizeof(DNode));
		newnode->data = e;
		newnode->next = NULL;
		newnode->prior = tail;
		tail->next = newnode;
		tail = newnode;
	}
	return L;
}

int main()
{
	DLinkList L;
	InitDLinkList(L);	
	for(int i = 0; i < 10; i++){
		DNode *node = (DNode *)malloc(sizeof(DNode));
		node->data = i+1;
		ListInsert(L, i+1, node);
	}
	DNode *node = (DNode *)malloc(sizeof(DNode));
	node->data = 10;
	InsertNextNode(L, node); 
	DeleteNextNode(L); 

//	ListHeadInsert(L);
	ListTailInsert(L);
	DNode *p = L->next;
	int i = 1;
	while(p != NULL){
		printf("第%d個結點的值是:%d\n", i++, p->data);
		p = p->next;
	} 
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章