双向链表的空间结构如下图所示:
#include <stdio.h>
#include <stdlib.h>struct Node
{
char data;
struct Node *left;
struct Node *right;
};
typedef struct Node DListNode;
typedef struct Node *DLinkList;
int InitDList(DLinkList *head);
int CreateDList(DLinkList head,int n);
void PrintDList(DLinkList head);
DListNode *GetElem(DLinkList head,int i);
int InsertDList(DLinkList head,int i,char e);
int main(void)
{
DLinkList h;
int n; //链表元素个数
char e;
int pos;
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);
return 0;
}
int InitDList(DLinkList *head) //初始化双向循环链表
{
*head=(DLinkList)malloc(sizeof(DListNode));
(*head)->left=*head;
(*head)->right=*head;
return 1;
}
int CreateDList(DLinkList head,int n) //创建双向循环链表
{
DListNode *p,*q;
int i;
char e;
q=head;
for(i=1;i<=n;i++)
{
printf("输入第%d个元素:",i);
e=getchar();
p=(DListNode*)malloc(sizeof(DListNode));
p->data=e;
/*将新生成的结点插入到双向循环链表*/
p->right=q->right;
q->right=p;
p->left=q;
head->left=p; /*这里要注意头结点的left指向新插入的结点*/
q=p; /*q始终指向最后一个结点*/
getchar();
}
return 1;
}
void PrintDList(DLinkList head)//输出双向循环链表中的每一个元素
{
DListNode *p;
p=head->right;
while(p!=head)
{
printf("%c",p->data);
p=p->right;
}
printf("\n");
}
DListNode *GetElem(DLinkList head,int i)//查找插入的位置,返回结点的指针,否则返回NULL
{
DListNode *p;
int j;
p=head->right;
j=1;
while(p!=head && j<i)
{
p=p->right;
j++;
}
if(p==head || j>i)
return NULL;
return p;
}
int InsertDList(DLinkList head,int i,char e) //在双向循环链表的第i个位置插入元素e
{
DListNode *p,*s;
p=GetElem(head,i);
if(!p)
return -1;
s=(DListNode*)malloc(sizeof(DListNode));
s->data=e;
s->left=p->left;
p->left->right=s;
s->right=p;
p->left=s;
return 1;
}