/**
* 实验题目:
* 实现双链表各种基本运算的算法
* 实验内容:
* 设计一个程序,实现双链表的各种基本运算,并在此基础上设计一个
* 主程序完成如下功能:
* 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的第三个元素。
* 11、输出双链表h。
* 12、释放双链表h。
*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct DNode // 定义双链表结点类型
{
ElemType data; // 数据域
struct DNode *prior; // 指向前驱结点
struct DNode *next; // 指向后继结点
}DLinkList;
/*---------------------初始化双链表L------------------*/
void InitList(DLinkList *&L)
{
L = (DLinkList *)malloc(sizeof(DLinkList)); // 创建头结点
L->prior = L->next = NULL;
}
/*------------------释放双链表L------------------------*/
void DestroyList(DLinkList *&L)
{
DLinkList *p = L, *q = p->next;
while(q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
/*----------------------判断双链表L是否为空表------------------*/
int ListEmpty(DLinkList *L)
{
return (L->next == NULL);
}
/*----------------------返回双链表L的元素个数------------------*/
int ListLength(DLinkList *L)
{
int i = 0;
DLinkList *p = L;
while(p->next != NULL)
{
i++;
p = p->next;
}
return (i);
}
/*-----------------------输出双链表L-----------------------*/
void DispList(DLinkList *L)
{
DLinkList *p = L->next;
while(p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
/*-------------------获取双链表L中第i个元素-------------------*/
int GetElem(DLinkList *L, int i, ElemType &e)
{
int j = 0;
DLinkList *p = L;
while((j < i) && (p != NULL))
{
j++;
p = p->next;
}
if(p == NULL)
return 0;
else
{
e = p->data; // 提取数据元素
return 1;
}
}
/*-----------------------在双链表L中查找元素e---------------------*/
int LocateElem(DLinkList *L, ElemType e)
{
int n = 1;
DLinkList *p = L->next;
while((p != NULL) && (p ->data != e))
{
n++;
p = p->next;
}
if(p == NULL)
return 0;
else
return n;
}
/*--------------------在双链表L中第i个位置上插入元素e----------------------*/
int ListInsert(DLinkList *&L, int i, ElemType e)
{
int j = 0;
DLinkList *p = L, *s;
while((j < i - 1) && (p != NULL))
{
j++;
p = p->next;
}
if(p == NULL) // 未找到第i-1个结点
return 0;
else // 找到第i-1个结点
{
s = (DLinkList *)malloc(sizeof(DLinkList));// 创建新结点s
s->data = e;
s->next = p->next; // 将s插入到p之后
if(p ->next != NULL)
p->next->prior = s;
s->prior = p;
p->next = s;
return 1;
}
}
/*-----------------在双链表L中删除第i个元素----------------------*/
int ListDelete(DLinkList *&L, int i, ElemType &e)
{
int j = 0;
DLinkList *p = L, *q;
while((j < i - 1) && (p != NULL))
{
j++;
p = p->next;
}
if(p == NULL) // 未找到第i-1个结点
return 0;
else // 找到第i-1个结点
{
q = p->next; // q指向要删除的结点
if(q == NULL) // 不存在第i个结点
return 0;
e = q->data;
p->next = q->next; // 从链表中删除q结点
if(p->next != NULL)
p->next->prior = p;
free(q); // 释放q结点
return 1;
}
}
int main(void)
{
DLinkList *h;
ElemType e;
printf("(1)初始化双链表h\n");
InitList(h);
printf("(2)依次采用尾插法插入a、b、c、d、e元素\n");
ListInsert(h, 1, 'a');
ListInsert(h, 2, 'b');
ListInsert(h, 3, 'c');
ListInsert(h, 4, 'd');
ListInsert(h, 5, 'e');
printf("(3)输出双链表h:");
DispList(h);
printf("(4)双链表h长度 = %d\n", ListLength(h));
printf("(5)双链表h为%s\n", (ListEmpty(h) ? "空" : "非空"));
GetElem(h, 3, e);
printf("(6)双链表h的第3个元素 = %c\n", e);
printf("(7)元素a的位置 = %d\n", LocateElem(h, 'a'));
printf("(8)在第4个元素位置上插入f元素\n");
ListInsert(h, 4, 'f');
printf("(9)输出单链表h:");
DispList(h);
printf("(10)删除h的第三个元素\n");
ListDelete(h, 3, e);
printf("(11)输出双链表h:");
DispList(h);
printf("(12)释放双链表h\n");
DestroyList(h);
return 0;
}
测试结果:
(1)初始化双链表h
(2)依次采用尾插法插入a、b、c、d、e元素
(3)输出双链表h:a b c d e
(4)双链表h长度 = 5
(5)双链表h为非空
(6)双链表h的第3个元素 = c
(7)元素a的位置 = 1
(8)在第4个元素位置上插入f元素
(9)输出单链表h:a b c f d e
(10)删除h的第三个元素
(11)输出双链表h:a b f d e
(12)释放双链表h