现在的位置: 首页 > 综合 > 正文

数据结构学习(五)——循环双链表的操作之创建,插入、删除

2013年10月09日 ⁄ 综合 ⁄ 共 2053字 ⁄ 字号 评论关闭

双链表的含义就是链表结构体中有两个指针域,一个指向前一个结点,另一个指向后一个结点。下面的代码是对循环双链表的操作练习。

#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");
}

下面学习的就是另外一种数据结构了——队列微笑

抱歉!评论已关闭.