双向链表(C语言实现)学习记录
来源:互联网 发布:淘宝买的lol号安全吗 编辑:程序博客网 时间:2024/06/13 00:49
双向链表(C语言实现)学习记录
(1)具体内容与实现结果
1.初始化双链表:
void DoubleLink_InitList(pDoubleLinkList L) //初始化
{
L=(struct DoubleLinkList*)malloc(sizeof(DoubleLinkList)); //创建头结点
L->prior = L->next=NULL;
}
2.依次采用尾插法插入1,2,3,4,5元素
status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素
{
int j=0;
pDoubleLinkList p = L, s;
while (j< i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p == NULL)
return false;
else
{
s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));
s->data = e;
s->next = p->next;
s->next = NULL;
if (p->next != NULL)
//p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
}
3.输出双链表:
void DoubleLink_DispList(pDoubleLinkList L) //输出线性表
{
pDoubleLinkList p = L->next;
while (p != NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
4.输出双链表长度
int DoubleLink_ListLength(pDoubleLinkList L) //求线性表的长度
{
pDoubleLinkList p = L;
int i = 0;
while (p->next != NULL)
{
i++;
p=p->next;
}
return(i);
}
5.双链表是否为空
status DoubleLink_ListEmpty(pDoubleLinkList L) //判线性表是否为空表
{
return (L->next==NULL);
}
6.双链表的指定位置的元素。
status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType* e) //求线性表中某个数据元素值
{
int j = 0;
pDoubleLinkList p = L;
while (j<i && p!=NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return 0;
else
{
*e = p->data;
return 1;
}
}
7.双链表的指定元素的位置
int DoubleLink_LocateElem(pDoubleLinkList L, ElemType e)//按元素值查找
{
int n=1;
pDoubleLinkList p = L->next;
while (p != NULL && p->data != e)
{
n++;
p = p->next;
}
if (p == NULL)
return(0);
else
return(n);
}
8.指定位置插入元素
status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素
{
int j=0;
pDoubleLinkList p = L, s;
while (j< i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p == NULL)
return false;
else
{
s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));
s->data = e;
s->next = p->next;
s->next = NULL;
if (p->next != NULL)
p->prior = s;
s->prior = p;
p->next = s;
return true;
}
}
9.双链表删除元素
status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e) //删除数据元素
{
int j = 0;
pDoubleLinkList p = L, q;
while (j < i-1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点
return 0;
else //找到第i-1个结点*p
{
q = p->next; //q指向要删除的结点
if (q == NULL)
return 0; //不存在第i个结点
e = q->data;
p->next = q->next; //从单链表中删除*q结点
if (p->next != NULL)
q->prior = p;
free(q); //释放*q结点
return 1;
}
}
10释放双链表
void DoubleLink_DestroyList(pDoubleLinkList L) //销毁线性表
{
pDoubleLinkList p = L;
pDoubleLinkList q = p;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
实现结果如下:
(2)完整源代码
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int status;
//定义数据类型,定义链表结点的存储结构与数据类型
typedef int ElemType;
typedef struct DoubleLinkList//定义双链表结点类型
{
ElemType data;
struct DNode * prior; //指向前驱结点
struct DNode * next; //指向后继结点
} DoubleLinkList, * pDoubleLinkList;
void DoubleLink_InitList(pDoubleLinkList L); //初始化
void DoubleLink_DestroyList(pDoubleLinkList L); //销毁线性表
status DoubleLink_ListEmpty(pDoubleLinkList L); //判线性表是否为空表
int DoubleLink_ListLength(pDoubleLinkList L); //求线性表的长度
void DoubleLink_DispList(pDoubleLinkList L); //输出线性表
status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType *e); //求线性表中某个数据元素值
int DoubleLink_LocateElem(pDoubleLinkList L, ElemType e); //按元素值查找
status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e); //插入数据元素
status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e); //删除数据元素
//主调函数
int main()
{
DoubleLinkList H;
ElemType e;
printf("双链表的基本运算如下:\n");
printf("(1)初始化双链表\n");
DoubleLink_InitList(&H);
printf("(2)依次采用尾插法插入1,2,3,4,5元素\n");
DoubleLink_ListInsert(&H, 1, 1);
DoubleLink_ListInsert(&H, 2, 2);
DoubleLink_ListInsert(&H, 3, 3);
DoubleLink_ListInsert(&H, 4, 4);
DoubleLink_ListInsert(&H, 5, 5);
printf("(3)输出双链表:");
DoubleLink_DispList(&H);
printf("(4)双链表长度=%d\n", DoubleLink_ListLength(&H));
printf("(5)双链表为%s\n", (DoubleLink_ListEmpty(&H)?"空":"非空"));
DoubleLink_GetElem(&H, 3, &e);
printf("(6)双链表的第3个元素=%d\n", e);
printf("(7)元素2的位置=%d\n",DoubleLink_LocateElem(&H, 2));
printf("(8)在第4个元素位置上插入元素8\n");
DoubleLink_ListInsert(&H, 4, 8);
printf("(9)输出双链表:");
DoubleLink_DispList(&H);
printf("(10)删除h的第3个元素\n");
DoubleLink_ListDelete(&H, 3, &e);
printf("(11)输出双链表H:");
DoubleLink_DispList(&H);
printf("(12)释放双链表\n");
DoubleLink_DestroyList(&H);
printf("(13)释放双链表...OK!\n");
return 0;
}
void DoubleLink_InitList(pDoubleLinkList L) //初始化
{
L=(struct DoubleLinkList*)malloc(sizeof(DoubleLinkList)); L->prior=L->next=NULL;
}
void DoubleLink_DestroyList(pDoubleLinkList L) //销毁线性表
{
pDoubleLinkList p = L;
pDoubleLinkList q = p;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
status DoubleLink_ListEmpty(pDoubleLinkList L) //判线性表是否为空表
{
return (L->next==NULL);
}
int DoubleLink_ListLength(pDoubleLinkList L) //求线性表的长度
{
pDoubleLinkList p = L;
int i = 0;
while (p->next != NULL)
{
i++;
p=p->next;
}
return(i);
}
void DoubleLink_DispList(pDoubleLinkList L) //输出线性表
{
pDoubleLinkList p = L->next;
while (p != NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
status DoubleLink_GetElem(pDoubleLinkList L, int i, ElemType* e) //求线性表中某个数据元素值
{
int j = 0;
pDoubleLinkList p = L;
while (j<i && p!=NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return 0;
else
{
*e = p->data;
return 1;
}
}
int DoubleLink_LocateElem(pDoubleLinkList L, ElemType e)//按元素值查找
{
int n=1;
pDoubleLinkList p = L->next;
while (p != NULL && p->data != e)
{
n++;
p = p->next;
}
if (p == NULL)
return(0);
else
return(n);
}
status DoubleLink_ListInsert(pDoubleLinkList L, int i, ElemType e) //插入数据元素
{
int j=0;
pDoubleLinkList p = L, s;
while (j< i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p == NULL)
return false;
else
{
s=(struct DoubleLinkList *)malloc(sizeof(DoubleLinkList));
s->data = e;
s->next = p->next;
s->next = NULL;
if (p->next != NULL)
p->prior = s;
s->prior = p;
p->next = s;
return true;
}
}
status DoubleLink_ListDelete(pDoubleLinkList L, int i, ElemType *e) //删除数据元素
{
int j = 0;
pDoubleLinkList p = L, q;
while (j < i-1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点
return 0;
else //找到第i-1个结点*p
{
q = p->next; //q指向要删除的结点
if (q == NULL)
return 0; //不存在第i个结点
e = q->data;
p->next = q->next; //从单链表中删除*q结点
if (p->next != NULL)
q->prior = p;
free(q); //释放*q结点
return 1;
}
}
分享(share )是快乐的,也是见证个人的成长历程,文章主要为平时学习积累,基于自身认知不足之处在所难免,也恳请大家指正,共同进步
- 双向链表(C语言实现)学习记录
- 单向链表(C语言实现)学习记录
- C语言实现双向链表删除、插入、双向输出
- 双向链表代码实现-C语言
- 双向链表C语言实现
- C语言实现双向链表[上]
- C语言实现双向链表
- c语言双向链表的实现
- C语言实现双向循环链表
- C语言实现双向链表
- 双向链表的C语言实现
- C语言实现双向循环链表
- 【C语言】双向链表的实现
- C语言实现双向循环链表
- C语言实现双向循环链表
- C语言实现双向链表
- c语言:双向链表的实现
- C语言双向循环链表实现
- 2016 CCPC 秦皇岛 G Numbers 【贪心+大数+高精度】
- 菜鸟学习历程【4】数组(2)、函数
- matplotlib+pyqt4 内容整理
- 201711122220->mysql删除database
- 程序员如何转型人工智能(机器学习)
- 双向链表(C语言实现)学习记录
- 设计模式-适配器模式
- ExtJs之下拉框ComboBox
- markdown语法之数学符号汇总
- 新增其他常用元素
- mybatis的批量删除
- Effective STL学习笔记-条款33
- SpringBoot学习笔记——浅谈AOP
- 如何查看ELF文件