1. 程式人生 > >建立雙向連結串列的演算法——C語言實現

建立雙向連結串列的演算法——C語言實現

建立雙向連結串列的演算法——C語言實現

雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個節點包含兩個指標,分別指向直接後繼和直接前驅(頭節點的前驅指空,尾節點的後繼指空)。所以,從雙向連結串列中的任意一個非前驅非後繼節點開始,都能很方便地訪問它的前驅和後繼節點。

實際上如果熟練掌握了單向連結串列的基本操作,雙向連結串列的建立只是每次新建好一個節點後掛鏈的時候多操作一個指標而已。如果你單向連結串列的建立還不熟悉,可以看這篇文章中的方法:建立單向連結串列的三種演算法

本文給出建立雙向連結串列的C語言程式碼,然後在註釋中對其進行簡單分析。

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

typedef struct Node{
	int data;
	struct Node *front,*next;	//雙向連結串列每個節點都有兩個指標 
}ElemSN;

ElemSN *CreatLink(int data[],int num)//建立雙向連結串列 
{
	int i;
	ElemSN *p=NULL,*q=NULL,*h=NULL;
	
	for(i=0;i<num;i++){
		p=(ElemSN *)malloc(sizeof(ElemSN));
		p->next=NULL;
		p->data=data[i];
		if(!h){	//處理頭節點 
			h=p;
			h->front=NULL;//頭節點的前驅為空 
		}
		else{
			q->next=p;
			p->front=q;
		}
		q=p;
	}
	return h;
}

ElemSN *FindTail(ElemSN *h)//找到雙向連結串列的尾節點 
{
	ElemSN *p=h;
	while(p->next!=NULL){
		p=p->next;
	}
	return p;
}

void PrintLink(ElemSN *h)//輸出雙向連結串列資料域的值 
{
	ElemSN *p=NULL;
	for(p=h;p!=NULL;p=p->next){
		printf("%d\t",p->data);
	}
	printf("\n雙向連結串列順序輸出結束!\n"); 
}

void BackPrintLink(ElemSN *t)//逆序輸出雙向連結串列的值 
{
	ElemSN *p=NULL;
	for(p=t;p!=NULL;p=p->front){
		printf("%d\t",p->data);
	}
	printf("\n雙向連結串列逆序輸出結束!\n"); 
}

void FreeSpace(ElemSN *h)//釋放malloc分配的空間 
{
	int i;
	ElemSN *t = NULL;
	while(t != NULL){
		t = h;
		h = h->next;
		free(t);
	}
}

int main(void)
{
	ElemSN *head=NULL,*tail=NULL;
	int data[8]={3,2,5,8,4,7,6,9};
	int num=8;
	
	head=CreatLink(data,num);
	tail=FindTail(head);
	printf("順序輸出連結串列值:\n");
	PrintLink(head);
	printf("逆序輸出連結串列值:\n");
	BackPrintLink(tail);
	FreeSpace(head);
	 
	return 0;
}