一、实验内容
编写一个程序,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为int),并在此基础上设计一个程序完成以下功能。
(1)初始化循环双链表h。
(2)依次采用尾插法插入a、b、c、d、e元素。
(3)输出循环双链表h。
(4)输出循环双链表h的长度。
(5)判断循环双链表h是否为空。
(6)输出循环双链表h的第3个元素。
(7)输出元素a的位置。
(8)在第4个元素的位置上插入f元素。
(9)输出循环双链表h。
(10)删除循环双链表h的第3个元素。
(11)输出循环双链表h。
(12)释放循环双链表h。
二、代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct DNode{
char data;
struct DNode *next;
struct DNode *prior;
}DLinkNode;
//1初始化双链表
void InitList(DLinkNode *&H){
H=(DLinkNode *)malloc(sizeof(DLinkNode));
H->next=H,H->prior=H;
}
//2依次采用尾插法插入字符(即创建链表)
void CreateListR(DLinkNode *&H,char a[],int n){
DLinkNode *s,*r;
H=(DLinkNode *)malloc(sizeof(DLinkNode));
r=H;
for(int i=0;i<n;i++){
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=H;
H->prior=r;
}
//3输出双链表L
void DispList(DLinkNode *H){
DLinkNode *p=H->next;
while(p!=H){
printf("%c\t",p->data);
p=p->next;
}
printf("\n");
}
//4输出双链表的长度
int ListLength(DLinkNode *H){
int n=0;
DLinkNode *p=H;
while(p->next!=H){
n++;
p=p->next;
}
return n;
}
//5判断双链表h是否为空
bool ListEmpty(DLinkNode *H){
return(H->next==H);
}
//6输出双链表h的第三个元素
bool GetElem(DLinkNode *H,int i,char &e){
int j=1;
if(i<1) return false;
DLinkNode *p=H->next;
while(j<i && p!=H){
j++;
p=p->next;
}
if(p==H) return false;
else{
e=p->data;
return true;
}
}
//7输出元素a的位置
int LocateElem(DLinkNode *L,char a){
int i=1;
DLinkNode *p=L->next;
while(p->data!='a' && p!=L){
p=p->next;
i++;
}
if(p==L) return(0);
else return(i);
}
//8在第四个元素的位置上插入元素f
bool ListInsert(DLinkNode *&H,int i,char e){
int j=1;
DLinkNode *p=H->next,*s;
if(i<1) return false;
while(j<i && p!=NULL){
j++;
p=p->next;
}
if(p==NULL)return false;
else{
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=e;
s->next=p;
p->prior->next=s;
s->prior=p->prior;
p->prior=s;
return true;
}
}
//9输出双链表h(直接与三同理)
//10删除双链表h的第三个元素
bool ListDelete(DLinkNode *&H,int i,char &e){
int j=1;
DLinkNode *p=H->next,*q;
if(i<1) return false;
while(j<i && p!=H){
j++;
p=p->next;
}
if(p==H)return false;
else{
p->next->prior=p->prior;
p->prior->next=p->next;
return true;
}
}
//11输出双链表h(直接与三同理)
//12释放双链表h
void DestroyList(DLinkNode *&H){
DLinkNode *pre=H,*p=p->next;
while(p!=H){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
int main(){
DLinkNode *H;
//1初始化链表H
printf(" 1初始化链表H\n");
InitList(H);
//2依次插入元素a,b,c,d,e元素(可以理解为用字符数组创建顺序串)
printf("\n 2依次插入元素a,b,c,d,e元素(可以理解为用字符数组创建链表)\n");
char a[5]={'a','b','c','d','e'};
CreateListR(H,a,5);
//3输出链表H
printf("\n 3输出链表H:");
DispList(H);
//4输出链表H的长度
printf("\n 4输出链表H的长度:");
ListLength(H);
printf("长度为:%d \n",ListLength(H));
//5判断H是否为空
printf("\n 5判断H是否为空:");
ListEmpty(H);
if(ListEmpty(H))
printf("表为空\n");
else
printf("表非空\n");
//6输出链表H的第三个元素
printf("\n 6输出链表H的第三个元素:");
char e;
GetElem(H,3,e);
printf("链表H的第三个元素为:%c \n",e);
//7输出元素a的位置
printf("\n 7输出元素a的位置:");
LocateElem(H,'a');
printf("%d\n",LocateElem(H,'a'));
//8在第四个元素的位置上插入元素f
printf("\n 8在第四个元素的位置上插入元素f\n");
ListInsert(H,4,'f');
//9输出链表H
printf("\n 9输出链表H:");
DispList(H);
//10删除链表H第三个元素
printf("\n 10删除链表H第三个元素:");
ListDelete(H,3,e);
printf("%c 被删除\n",e);
//11输出链表H
printf("\n 11输出链表H:");
DispList(H);
//12释放链表H
printf("\n 12释放链表H");
DestroyList(H);
return(0);
}