实现双链表的各基本算法
2021/9/26 22:10:50
本文主要是介绍实现双链表的各基本算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef char ElemType; typedef struct DNode { ElemType data; struct DNode *prior; struct DNode *next; }DLinkNode; int CreateList(DLinkNode *L, ElemType a[], int n ) { DLinkNode * s , * r; L = (DLinkNode *)malloc(sizeof(DLinkNode)); //创建头结点 r = L; 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 = NULL; } //尾插法创建双链表 int InitList(DLinkNode *L) { L -> next = NULL; L -> prior = NULL; } //初始化 int ListInsert(DLinkNode *L, int i, ElemType e) { DLinkNode *p = L, *s; int j = 0; while(j < i - 1) { j++; p = p -> next; } s = (DLinkNode *)malloc(sizeof(DLinkNode)); s -> data = e; s -> next = p -> next; if (p -> next != NULL) p -> next -> prior = s; s -> prior = p; p -> next = s; } //在链表的第i个位置插入元素e int DispList(DLinkNode *L) { DLinkNode *p = L -> next; while (p != NULL) { printf("%c ",p -> data); p = p -> next; } printf("\n\n"); } //打印链表 int ListLength(DLinkNode *L) { int n = 0; DLinkNode *p = L; while(p -> next != NULL) { n++; p = p -> next; } printf("此表的长度为:%d\n\n",n); } //输出表的长度 int ListEmpty(DLinkNode *L) { if(L -> next == NULL) printf("此表为空表\n\n"); else printf("此表不是空表\n\n"); } int GetElem(DLinkNode *L, int i) { DLinkNode *p = L; for(int j = 0 ; j < i ; j++) p = p -> next; ElemType e = p -> data; printf("第%d个元素是:%c\n\n",i,e ); } //输出第i个元素 int LocateElem(DLinkNode *L, ElemType e) { DLinkNode *p = L -> next; int j = 1; while(p -> data != e) { j++; p = p -> next; } printf("元素%c的序号是:%d\n\n", e, j); } //输出元素e的位置 int ListDelete(DLinkNode *L , int i) { DLinkNode *p = L , *s; int j = 0; while(j < i-1) { p = p -> next; j++; } s = p -> next; p -> next = s -> next; s -> next -> prior = p; free(s); } //删除第i个元素 int DestroyList(DLinkNode *L) { DLinkNode *p = L, *q = L -> next; while(q != NULL) { free(p); p = q; q = p -> next; } } int main( ) { DLinkNode L; //建表 InitList(&L); //初始化 printf("依次采用尾插法插入a、b、c、d、e元素\n"); ListInsert(&L , 1 , 'a'); ListInsert(&L , 2 , 'b'); ListInsert(&L , 3 , 'c'); ListInsert(&L , 4 , 'd'); ListInsert(&L , 5 , 'e'); DispList(&L); //打印链表 ListLength(&L); //输出表的长度 ListEmpty(&L); //判断此表是不是空表 GetElem(&L, 3); //打印表的第i个元素 LocateElem(&L, 'a'); //打印元素e的位置 ListInsert(&L , 4 , 'f'); DispList(&L); ListDelete(&L , 3); //删除第i个元素 DispList(&L); DestroyList(&L); return 0; }
在单链表的基础上添加前驱节点prior使得链表成为一个双链表
李春葆数据结构第二章实验操作
这篇关于实现双链表的各基本算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27数据结构与算法面试题详解及练习
- 2024-12-27网络请求面试题详解与实战
- 2024-12-27数据结构和算法面试真题详解与实战教程
- 2024-12-27网络请求面试真题解析与实战教程
- 2024-12-27数据结构和算法大厂面试真题详解与实战指南
- 2024-12-27TS大厂面试真题解析与应对策略
- 2024-12-27TS大厂面试真题详解与解析
- 2024-12-27网站安全入门:如何识别和修复漏洞
- 2024-12-27SQL注入基础教程
- 2024-12-27初学者指南:理解和修复跨域漏洞