1. 程式人生 > >資料結構——雙向迴圈連結串列

資料結構——雙向迴圈連結串列

程式碼實現

    typedef struct node
		{
			int data;//資料域
			struct node *next;
			struct node *prev;
		}NODE,*PNODE;

	PNODE init_dc_list(void)//雙向迴圈連結串列的初始化
		{
			PNODE phead = malloc(sizeof(NODE));
			if(phead ==NULL)
				return phead;
			phead->prev = phead;
			phead->next = phead;
			return phead;
		}

	PNODE new_node(int dat)//新建一個節點
		{
			PNODE pnew = malloc(sizeof(NODE));
			if(pnew ==NULL)
				return pnew;
			pnew->data = dat;
			pnew->prev = pnew;
			pnew->next = pnew;
			return pnew;
		}

	//把地址為pnew的節點插入到雙向迴圈連結串列的尾部(頭節點的前面)
	bool list_add_tail(PNODE phead,PNODE pnew)
		{
			if(pnew == NULL || phead == NULL)
				return false;
			phead->prev->next = pnew;
			pnew->prev = phead->prev;
			phead->prev = pnew;
			pnew->next = phead;
			return true;
		}

	void show_dc_list(PNODE phead)//雙向迴圈連結串列的遍歷
		{
			PNODE p;
			if(phead == NULL)
				return;
			p = phead->prev;
			while(p != phead)
			{
				printf("%d\t",p->data);
				p = p->prev;
			}
			printf("\n");
		}

	//刪除雙向迴圈連結串列中地址為pdel的節點
	bool del_dc_node(PNODE phead,PNODE pdel)
		{
			PNODE p;
			if(phead == pdel || phead == NULL || pdel == NULL)
				return false;
			p = phead->next;
			while(p != phead)
			{
				if(p == pdel )
					break;
				p = p->next;	
			}
			if(p != pdel)
				return false;	
			pdel->prev->next = pdel->next;
			pdel->next->prev = pdel->prev;
			pdel->next = pdel->prev = NULL;
			return true;
		}
    
    PNODE find_node(PNODE phead,int dat)//雙向迴圈連結串列的查詢
		{
			if(phead == NULL)
				return phead;
			PNODE p = phead->next;
			while(p != phead)
			{
				if(p->data == dat)
					break;
				p = p->next;
			}	
			if(p == phead)
			{
				printf("dat is not in link list\n");
				return NULL;
			}
			return p;
		}