本科课程【数据结构与算法】实验2——单链表与双向循环链表的插入、删除操作(C++实现)
2022/3/1 22:22:16
本文主要是介绍本科课程【数据结构与算法】实验2——单链表与双向循环链表的插入、删除操作(C++实现),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html
一、 实验目的
- 掌握线性表的链表表示;
- 实现单链表的插入操作
- 实现单链表的删除操作
- 实现双向链表的插入操作
- 实现双向链表的删除操作
二、 实验内容
1. 实验任务
a. 完成单链表的建立、插入和删除
b. 完成双向链表的建立、插入和删除
2. 程序设计
1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
节点个数:count;
节点元素值:temp;
要插入节点的位置和数值:num1、Data;
要删除节点的位置:num2;
2) 数据存储(输入数据在内存中的存储)
动态分配内存(pNode pNew = (pNode)malloc(sizeof(Node));)
3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
4) 数据输出(贴图:程序运行结果截图。图幅大小适当,不能太大)
三、 实验环境
- 操作系统:WINDOWS 10
- 开发工具:VC++ 2013
- 实验设备:PC
四、源代码
1. 单链表的插入删除操作
- pNode CreatList(); //创建链表函数
- void TravelseList(pNode); //遍历链表函数
- bool Insert_Node(pNode, int, int); //插入节点
- int Del_Node(pNode, int); //删除节点
#include<iostream> using namespace std; typedef struct node { int data; struct node *pNext; }Node, *pNode; pNode CreatList(); //创建链表函数 void TravelseList(pNode); //遍历链表函数 bool Insert_Node(pNode, int, int); //插入节点 int Del_Node(pNode, int); //删除节点 int main() { pNode pHead = NULL; //struct Node *pHead=NULL int Data; int num; pHead = CreatList(); TravelseList(pHead); cout << "输入要插入的位置和数据:"; cin >> num >> Data; Insert_Node(pHead, num, Data); TravelseList(pHead); cout << "输入要删除的位置:"; cin >> num; Del_Node(pHead, num); TravelseList(pHead); system("pause"); return 0; } //创建链表 pNode CreatList() { int count; //节点个数 int temp; //临时存储用户输入的节点的数据 pNode pHead = (pNode)malloc(sizeof(Node)); //不存放有效数据的头结点 pNode pTail = pHead; //链表的最后一个节点 pTail->pNext = NULL; //最后一个节点指针置为空 cout << "输入节点个数" << endl; cin >> count; for (int i = 0; i < count; i++) { cout << "输入第" << i + 1 << "个节点的数值" << endl; cin >> temp; pNode pNew = (pNode)malloc(sizeof(Node)); //给新节点分配空间 pNew->data = temp; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void TravelseList(pNode pHead) { cout << "链表的数据如下:"; pNode p = pHead->pNext; while (p != NULL) { cout << p->data << " "; p = p->pNext; } cout << endl; return; } //插入 bool Insert_Node(pNode pHead, int front, int Data) { int i = 0; pNode _node = pHead; pNode pSwap; //交换指针 if ((front < 1) && (_node != NULL)) { return false; } while (i < front - 1) { _node = _node->pNext; ++i; } pNode pNew = (pNode)malloc(sizeof(Node)); pNew->data = Data; pSwap = _node->pNext; pNew = _node->pNext; pSwap = pNew->pNext; return true; } //删除 int Del_Node(pNode pHead, int back) { int i = 0; int Data; pNode _node = pHead; pNode pSwap; if ((back < 1) && (NULL == _node->pNext)) { printf("删除失败!\n"); return 0; } while (i < back - 1) { _node = _node->pNext; ++i; } pSwap = _node->pNext; Data = pSwap->data; _node->pNext = _node->pNext->pNext; free(pSwap); return Data; }
2. 双向循环链表的插入删除操作
头文件
#ifndef _DOUBLELINKLIST_H_ #define _DOUBLELINKLIST_H_ // // 在此处包含 C 标准库头文件 // #include <stdio.h> #include<malloc.h> // // 在此处包含其他头文件 // // // 在此处定义数据结构 // typedef int ElemType; // 链表中元素的类型 typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode* prior; // 前趋指针 struct DuLNode* next; // 后继指针 }DuLinkList; // // 在此处声明函数 // int InsertBefore(DuLinkList* pListHead, int i, ElemType Elem); int Delete(DuLinkList* pListHead, int i, ElemType* pElem); #endif /* _DOUBLELINKLIST_H_ */
cpp文件
#include "DoubleLinkList.h" #include<iostream> using namespace std; int main(int argc, char* argv[]) { int i; ElemType Elem; DuLinkList* pListHead; // 双向循环链表的表头指针,指向表头节点 DuLinkList* pListNode; // 双向循环链表节点指针 // // 初始化双向循环链表的表头节点 // pListHead = (DuLinkList*)malloc(sizeof(DuLinkList)); pListHead->prior = pListHead; pListHead->next = pListHead; // // 初始化双向循环链表的节点 // for (i = 8; i>0; i--) { pListNode = (DuLinkList*)malloc(sizeof(DuLinkList)); pListNode->data = i; pListNode->next = pListHead->next; pListNode->prior = pListHead; pListHead->next->prior = pListNode; pListHead->next = pListNode; } // // 在第 i 个节点之前插入一个节点 // InsertBefore(pListHead, 3, 88); InsertBefore(pListHead, 20, 15); // 插入位置非法。插入失败。 // // 删除第 i 个节点 // Delete(pListHead, 3, &Elem); Delete(pListHead, 20, &Elem); // 删除位置非法。删除失败。 // // 销毁双向循环链表 // while (pListHead->next != pListHead) { pListNode = pListHead->next; pListHead->next = pListNode->next; pListNode->next->prior = pListHead; free(pListNode); } free(pListHead); return 0; } /* 功能: 在第 i 个节点之前插入一个节点。 参数: pListHead -- 双向循环链表的表头指针 i -- 插入节点的位置。从 1 开始计数。 Elem -- 插入节点的值。 返回值: 如果插入成功返回 1 如果插入失败返回 0 */ int InsertBefore(DuLinkList* pListHead, int i, ElemType Elem) { DuLinkList* pListNode=NULL; // 节点指针 // // TODO: 在此添加代码 // if (i <= 0 && i > 8) cout << "插入非法" << endl; else { DuLinkList* s = (DuLinkList*)malloc(sizeof(DuLNode)); s->data = Elem; s->prior = pListNode->prior; pListNode->prior->next = s; s->next = pListNode; pListNode->prior = s; } return 0; } /* 功能: 删除第 i 个节点。 参数: pListHead -- 双向循环链表的表头指针 i -- 删除节点的位置。从 1 开始计数。 pElem -- 返回被删除节点的值。 返回值: 如果删除成功返回 1 如果删除失败返回 0 */ int Delete(DuLinkList* pListHead, int i, ElemType* pElem) { DuLinkList* pListNode; // 节点指针 // // TODO: 在此添加代码 // if (i <= 0 && i > 8) cout << "插入非法" << endl; else { pElem = pListNode->data; pListNode->prior->next = pListNode->next; pListNode->next->prior = pListNode->prior; free(pListNode); } return 0; }
博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html
这篇关于本科课程【数据结构与算法】实验2——单链表与双向循环链表的插入、删除操作(C++实现)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享