链式表示的线性表之三——双向链表2——插入操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84260925

问题:编写算法实现建立一个带结点的含n个元素的双向循环链表H,并在链表H中第i个位置插入一个元素e。例如,建立一个双向循环链表{'a','b','c','d','e','f','g'},元素为字符型数据,在链表中第5个位置插入元素‘y’,则链表变为{'a','b','c','d','y','e','f','g'}。

主要考察双向链表的基本操作,双向链表的操作与单链表类似,只是双向链表每个结点有两个指针域,比单链表操作稍微麻烦一些。

main.cpp

#include <iostream>
#include <conio.h>
#include <stdlib.h>

using namespace std;

typedef char DataType;
typedef struct Node
{
	DataType data;
	struct Node *prior;
	struct Node *next;
}DListNode,*DLinkList;
DListNode *GetElem(DLinkList head,int i);
void PrintDList(DLinkList head);
int CreateDList(DLinkList head, int n);
int InsertDList(DLinkList head,int i,char e);

int InitDList(DLinkList *head)
{
	*head = (DLinkList)malloc(sizeof(DListNode));
	if (!head)
	{
		return -1;
	}
	(*head)->next = *head;
	(*head)->prior = *head;
	return 1;
}
int CreateDList(DLinkList head, int n)
{
	DListNode *s, *q;
	int i;
	DataType e;
	q = head;
	for (i = 1; i <= n;i++)
	{
		cout << "输入第"<<i <<"个元素"<< endl;
		e = getchar();
		s = (DListNode*)malloc(sizeof(DListNode));
		s->data = e;
		s->next = q->next;
		q->next = s;
		s->prior = q;
		head->prior = s;
		q = s;
		getchar();
	}
	return 1;
}

int InsertDList(DLinkList head, int i, char e)
{
	DListNode *p, *s;
	p = GetElem(head, i);
	if (!p)
	{
		return 0;
	}
	s = (DListNode*)malloc(sizeof(DListNode));
	if (!s)
	{
		return -1;
	}
	s->data = e;
	s->prior = p->prior;
	p->prior->next = s;
	s->next = p;
	p->prior = s;
	return 1;
}

DListNode *GetElem(DLinkList head, int i)
{
	DListNode *p;
	int j;
	p = head->next;
	j = 1;
	while (p!=head&&j<i)
	{
		p = p->next;
		j++;
	}
	if (p==head||j>i)
	{
		return NULL;
	}
	return p;
}

void main()
{
	DLinkList h;
	int n;
	int pos;
	char e;
	InitDList(&h);
	cout << "请输入元素个数" << endl;
	scanf("%d",&n);
	getchar();
	CreateDList(h, n);
	cout << "链表中的元素" << endl;
	PrintDList(h);
	cout << "请输入插入的位置" << endl;
	scanf("%d", &pos);
	getchar();
	cout << "请输入插入的元素" << endl;
	scanf("%c", &e);
	getchar();
	InsertDList(h, pos, e);
	cout << "插入元素后的链表中的元素:" << endl;
	PrintDList(h);

	system("pause");
}

void PrintDList(DLinkList head)
{
	DListNode *p;
	p = head->next;
	while (p!=head)
	{
		//cout << p->data<<"";
		printf("%c", p->data);
		p = p->next;
	}
	cout << endl;
}

结果:

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/84260925
今日推荐