双向链表(C语言实现)学习记录
2017-11-12 22:21
197 查看
双向链表(C语言实现)学习记录
(1)具体内容与实现结果
1.初始化双链表:
2.依次采用尾插法插入1,2,3,4,5元素
3.输出双链表:
4.输出双链表长度
5.双链表是否为空
6.双链表的指定位置的元素。
7.双链表的指定元素的位置
8.指定位置插入元素
9.双链表删除元素
10释放双链表
实现结果如下:
(2)完整源代码
分享(share )是快乐的,也是见证个人的成长历程,文章主要为平时学习积累,基于自身认知不足之处在所难免,也恳请大家指正,共同进步
(1)具体内容与实现结果
1.初始化双链表:
void DoubleLink_InitList(pDoubleLinkList L) //初始化 { L=(struct DoubleLinkList*)malloc(sizeof(DoubleLinkList)); //创建头结点 L->prior = L->next=NULL; } |
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; } } |
void DoubleLink_DispList(pDoubleLinkList L) //输出线性表 { pDoubleLinkList p = L->next; while (p != NULL) { printf("%d",p->data); p=p->next; } printf("\n"); } |
int DoubleLink_ListLength(pDoubleLinkList L) //求线性表的长度 { pDoubleLinkList p = L; int i = 0; while (p->next != NULL) { i++; p=p->next; } return(i); } |
status DoubleLink_ListEmpty(pDoubleLinkList L) //判线性表是否为空表 { return (L->next==NULL); 4000 } |
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; } } |
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; } } |
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语言实现)学习记录
- [学习记录]Struct2里action之间跳转实现
- C语言学习记录
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- 通过冒泡排序(C语言实现)学习回调函数设计原理
- 链表学习--双向链表实现
- C语言实现线性结构创建动态链表的学习心得(一)
- 学习笔记——strstr函数的C语言实现,不调用库函数
- C语言队列的实现--学习组合设计(一)
- 看到foursquare下面用observable来实现对经纬度的刷新获取,特别记录observable学习(转载)
- 链表学习--双向链表实现
- 计算机网络,协议实现,学习记录
- 数据结构学习系列四-顺序栈(c语言实现)
- [学习笔记]小型论坛功能——实现按照指定每页的行数来分页显示记录[3]
- 数据结构学习记录连载4(上一篇中提高要求实现)
- 链表的C语言实现之循环链表及双向链表(转)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表