數據結構學習(五)——循環雙鏈表的操做之建立,插入、刪除

雙鏈表的含義就是鏈表結構體中有兩個指針域,一個指向前一個結點,另外一個指向後一個結點。下面的代碼是對循環雙鏈表的操做練習。數據結構

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

typedef struct list
{
	char data;
	struct list *prior;
	struct list *next;
}dlinklist;

dlinklist *CreateLinklist_End();		//尾插法建立循環雙鏈表
void ShowLinklist(dlinklist *h);		//輸出顯示鏈表
int DLinklist_Insert(dlinklist *h, char dat, int pos);	//雙鏈表按指定位置插入結點
int DLinklist_Delete(dlinklist *h, int pos);			//雙鏈表按指定位置刪除結點

int main(void)
{
	dlinklist *head;
	int choice, pos, ans;
	char dat;

	printf("循環雙鏈表的操做練習\n");
	printf("建立循環雙鏈表,請依次輸入字符數據('#'表示結束):\n");
	head = CreateLinklist_End();

	while(1)
	{
		printf("對雙鏈表操做:\n");
		printf("1.在指定位置插入一個結點\n");
		printf("2.刪除指定位置的結點\n");
		printf("3.輸出顯示鏈表\n");
		printf("4.退出程序\n");
		printf("作出選擇:\n");
		scanf("%d", &choice);
		getchar();
		switch(choice)
		{
		//鏈表結點的插入
		case 1:
			printf("請輸入你想插入的字符及位置,空格隔開:\n");
			scanf("%c %d", &dat, &pos);
			ans = DLinklist_Insert(head, dat, pos);
			if(ans)
				printf("插入成功!\n");
			else
				printf("插入失敗!\n");
			break;
		//鏈表結點的刪除
		case 2:
			printf("請輸入你想刪除的結點位置:");
			scanf("%d", &pos);
			ans = DLinklist_Delete(head, pos);
			if(ans)
				printf("刪除結點成功!\n");
			else
				printf("刪除結點失敗!\n");
			break;
		//輸出顯示鏈表
		case 3:
			ShowLinklist(head);
			break;
		//退出程序
		case 4:
			return 0;
			break;
		default:
			printf("選擇無效!\n");
			break;
		}
	}
	return 1;
}

//尾插法建立鏈表
dlinklist *CreateLinklist_End()
{
	dlinklist *head, *p, *e;
	char ch;

	head = (dlinklist*)malloc(sizeof(dlinklist));
	e = head;
	ch = getchar();
	
	while(ch != '#')
	{
		p = (dlinklist*)malloc(sizeof(dlinklist));
		p->data = ch;
		p->prior = e;
		e->next = p;
		e = p;
		ch = getchar();
	}
	e->next = head;		//尾結點的後指針指向頭指針
	head->prior = e;	//頭指針的前指針指向尾結點

	return head;
}

int DLinklist_Insert(dlinklist *h, char dat, int pos)
{
	dlinklist *p, *s;
	int i=0;
	
	p = h;

	while(i<pos-1 && p->next != h)		//找到指定位置結點的前一個結點
	{
		i++;
		p = p->next;
	}
	if(i != pos-1)
		return 0;
	p = p->next;
	s = (dlinklist*)malloc(sizeof(dlinklist));
	s->data = dat;
	s->prior = p->prior;				//核心插入結點操做代碼
	p->prior->next = s;
	s->next = p;
	p->prior = s;

	return 1;

}

//刪除指定位置結點
int DLinklist_Delete(dlinklist *h, int pos)
{
	dlinklist *p;
	int i = 0;
	
	p = h;

	while(i<pos && p->next!=h)		//找到指定位置結點
	{
		i++;
		p = p->next;
	}
	if(i != pos || i == 0)
		return 0;
	p->prior->next = p->next;		//刪除結點核心代碼
	p->next->prior = p->prior;
	free(p);

	return 1;
}

//輸出顯示鏈表
void ShowLinklist(dlinklist *h)
{
	dlinklist *p;

	p = h->next;

	while(p != h)
	{
		printf("%c ", p->data);
		p = p->next;
	}
	printf("\n");
}

下面學習的就是另一種數據結構了——隊列 微笑
相關文章
相關標籤/搜索