版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
结果: