双向链表的应用

#include
#include
#include

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 henad, int i, char e);

int InitDList(DLinkList *head)
{
	*head = (DLinkList)malloc(sizeof(DListNode));
	if (!head)
		return -1;
	(*head)->next = *head;  //使头结点的prior和next指针指向自己
	(*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++)
	{
		printf("输入%d个元素", i);
		e = getchar();
		s = (DListNode*)malloc(sizeof(DListNode));
		s->data = e;//将新生成的结点插入双向循环链表
		s->next = q->next;
		q->next = s;
		s->prior = q;
		head->prior = s;//这里注意头结点的prior指向新插入的结点
		q = s;  //q始终指向最后一个结点
		getchar();
	}
	return 1;
}
int InsertDList(DLinkList head, int i, DataType e)
{
	DListNode *p, *s;
	p = GetElem(head, i);		//查找链表中第i个结点
	if (!p)
		return 0;
	s = (DListNode*)malloc(sizeof(DListNode));
	if (!s)
		return -1;
	s->data = e;		//将s结点插入到双向链表中
	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)   //如果位置不整确,返回NULL
		return NULL;
	return p;
}
void main()
{
	DLinkList h;
	int n, pos;
	char e;
	InitDList(&h);
	printf("输入元素个数:");
	scanf("%d", &n);
	getchar();
	CreateDList(h, n);
	printf("链表中的元素:");
	PrintDList(h);
	printf("请输入元素以及位置:");
	scanf("%c", &e);
	getchar();
	scanf("%d", &pos);
	InsertDList(h, pos, e);
	printf("插入元素后链表中的元素:");
	PrintDList(h);
}
void PrintDList(DLinkList head)  //输出循环双链表中的每一个元素
{
	DListNode *p;
	p = head->next;
	while (p != head)
	{
		printf("%c", p->data);
		p = p->next;
	}
	printf("\n");
}

你可能感兴趣的:(数据结构)