天天看點

資料結構——單向循環連結清單

代碼實作 

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

	PNODE init_link_list(void)//單連結清單初始化
		{
			PNODE phead = malloc(sizeof(NODE));
			if(phead == NULL)
			 { exit(-1);}
			phead->next = phead;	
			return phead;
		}
	PNODE new_node(int dat)
		{
			PNODE pnew =malloc(sizeof(NODE));
			if(pnew == NULL)
				return pnew;
			pnew->data = dat;
			pnew->next = NULL;
			return pnew;
		}

	bool insert_node_tail(PNODE phead,PNODE pnew)//把位址為pnew的節點插入到單向循環連結清單的尾部(頭節點前面)
		{
			if(pnew == NULL || phead == NULL)
				return false;
			PNODE p = phead->next;
			while(p->next != phead)
				p = p->next;
			pnew->next = phead;
			p->next = pnew;
			return true;
		}

	 bool is_empty(PNODE phead)//判斷連結清單為空,沒有滿的情況
		{
			if(phead->next == phead)
				return true;
			else
				return false;
		}

	void show_list(PNODE phead)//連結清單的周遊
		{
			PNODE p = NULL;
			if(is_empty(phead))
			{
				printf("list is empty!\n");
				return;
			}
			p = phead->next;
			while(p != phead)//周遊
			{
				printf("%d\t",p->data);
				p = p->next;
			}
			printf("\n");
		}

	bool del_node(PNODE phead,PNODE pdel)//單向循環連結清單的删除
		{
			PNODE p;
			if(phead == pdel || phead == NULL || pdel == NULL)
				return false;
			//p = phead->next
			p = phead;
			while(p->next != phead)
			{
				if(p->next == pdel )
					break;
				p = p->next;
				//ptmp= ptmp->next;	
			}
			if(p->next != pdel)
				return false;
			//删除節點
			p->next = pdel->next;
			pdel->next = NULL;
			//free(pdel);
			return true;
		}
           

繼續閱讀