C/C++ 数据结构单链表的实现(初始化、插入、删除、销毁)
#include <iostream>
#include <Windows.h>
#define MAX_SIZE 100
using namespace std;
//单链表
typedef struct _LinkList {
int data;//数据域
struct _LinkList* next;//指针域
}LNode,*LinkList;
//初始化单链表
bool InitLinkList(LinkList& L) {
L = new LNode;
if (!L) return false;
L->next = NULL;
return true;
}
//前插法
bool InsertList_front(LinkList& L, LNode *node) {
if (!L || !node) return false;
node->next = L->next;
L->next = node;
return true;
}
//尾插法
bool InsertList_back(LinkList& L, LNode* node) {
if (!L || !node) return false;
LNode* p = NULL;
p = L;
while (p->next){
p = p->next;
}
node->next = NULL;
p->next = node;
return true;
}
//在单链表的任意位置插入
bool InsertList_casual(LinkList& L, int i, LNode* node) {
if (!L || !node) return false;
int j = 0;
LNode* p = L; while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p||j>i-1) {
return false;
}
node->next = p->next;
p->next = node;
return true;
}
//根据元素的位置获取元素
bool Get_Elems(LinkList& L,int i,LNode*& node) {
if (!L || !L->next)return false;
LNode* p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) return false;
node = p;
return true;
}
//按值查找元素
bool Find_Elme(LinkList& L,int &index,int elem) {
if (!L || !L->next)return false;
int j = 1;//位置的下标
LNode* p = L->next;
while (p&&p->data!=elem) {
p = p->next;
j++;
}
index = j; if (!p )return false; return true;
}
//按元素的位置删除元素
bool Delete_Elem1(LinkList& L, int index, int &elem) {
if (!L || !L->next)return false;
LNode* p = L;
int j = 0;
while (p->next&&j<index-1) {
p = p->next;
j++;
}
if (!p->next || j > index - 1)return false;
LNode* q = NULL;
q = p->next;
elem = q->data;
p->next = q->next;
delete q;
return true;
}
//根据指定的元素删除元素
bool Delete_Elem2(LinkList& L,int elem) {
if (!L || !L->next)return false;
LNode* p = L;
while (p->next) {
if (p->next->data == elem) {
LNode* q = p->next;
p->next = q->next;
delete q;
//return true;
}
else {
p = p->next;
}
}
return true;
}
void DestroyList(LinkList& L) {
LNode* p;
p = L;
while (p) {
L = L->next;
cout << "删除元素: " << p->data << endl;
delete p;
p = L;
}
cout << "顺序表的销毁!" << endl;
}
void PrintList(LinkList& L) {
LNode* p;
p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LNode* list = NULL;
int count1 = 0;//前插法元素个数
int count2 = 0;//尾插法元素个数
int count3 = 0;//任意位置插入个数
int i = 0;//插入的位置
int e = 0;//要插入的元素
if (InitLinkList(list)) {
cout << "单链表初始化成功!" << endl;
}
else {
cout << "单链表初始化失败!" << endl;
}
PrintList(list);
//前插法
cout << "请输入要插入的元素个数:(前插法)";
cin >> count1;
while (count1 > 0) {
LNode* p1 = NULL;
p1 = new LNode;
cout << "请输入要插入的元素:";
cin >> p1->data;
if (InsertList_front(list, p1)) {
cout << "元素 " << p1->data << " 插入成功!" << endl;
}
else {
cout << "元素 " << p1->data << " 插入失败!" << endl;
}
count1--;
}
PrintList(list);
//尾插法
cout << "请输入要插入的元素个数:(尾插法)";
cin >> count2;
while (count2 > 0) {
LNode* p2 = NULL;
p2 = new LNode;
cout << "请输入要插入的元素:";
cin >> p2->data;
if (InsertList_back(list, p2)) {
cout << "元素 " << p2->data << " 插入成功!" << endl;
}
else {
cout << "元素 " << p2->data << " 插入失败!" << endl;
}
count2--;
}
PrintList(list);
//在任意位置插入
cout << "请输入要插入的元素个数:(任意位置)";
cin >> count3;
while (count3 > 0) {
LNode* p3 = NULL;
p3 = new LNode;
cout << "请输入要插入的元素位置和元素:";
cin >> i >> p3->data;
if (InsertList_casual(list,i, p3)) {
cout << "元素 " << p3->data << " 插入成功!" << endl;
}
else {
cout << "元素 " << p3->data << " 插入失败!" << endl;
}
count3--;
}
PrintList(list);
//根据元素位置获取当前的值
LNode* p4 = NULL;
cout << "请输入想要查找的元素位置:";
cin >> i;
if (Get_Elems(list, i, p4)) {
cout << "第 " << i << " 个元素是:" << p4->data << endl;
}
else {
cout << "元素获取失败" << endl;
}
//按值查找元素
int elem = 0;
int index = 0;
cout << "请输入要查找的元素:";
cin >> elem;
if (Find_Elme(list,index, elem)) {
cout << "元素 " << elem << " 查找成功!" << "在单链表的第 " << index << " 个位置。" << endl;
}
else {
cout << "元素查找失败!" << endl;
}
//按元素的位置删除元素
int element = 0;//要删除的元素
cout << "请输入要删除的元素的位置:";
cin >> i;
if (Delete_Elem1(list, i,element)) {
cout << "在 " << i << " 处的元素 " << element << " 删除成功!" << endl;
PrintList(list);
}
else {
cout << "元素删除失败!" << endl;
}
//按元素删除元素
int element2 = 0;
cout << "请输入要删除的元素:";
cin >> element2;
if (Delete_Elem2(list,element2)) {
cout << "元素 " << element2 << " 删除成功!" << endl;
PrintList(list);
}
else {
cout << "元素删除失败!" << endl;
}
DestroyList(list); system("pause");
return 0;
}

C/C++ 数据结构单链表的实现(初始化、插入、删除、销毁)的更多相关文章
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
- python实现数据结构单链表
#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...
- SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- 数据结构——单链表java简易实现
巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成 通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...
- SDUT-2122_数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 按照数据输入的相反顺序(逆 ...
- Python实现单链表数据的添加、删除、插入操作
Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...
- C实现通用数据结构--单链表
单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言 ...
- C# 数据结构--单链表
什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...
- 数据结构-------单链表(C++)
相关信息: /** * @subject 数据结构 实验2 * @author 信管1142班 201411671210 赖俊杰 * @project 单链表 * @time 2015年10月29日1 ...
- 数据结构 单链表&顺序表
顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...
随机推荐
- git 初始化新的文件夹
1. tar xvf new_project.tar.gz 2. cd new_project 3. git config --global user.email "user.name@ ...
- python读取、写入txt文本
1. 读取txt文本 1.1 read() 一次性读全部内容 一次性读取文本中全部的内容,以字符串的形式返回结果 with open("text.txt", "r& ...
- ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台
ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台 ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台 Kint ...
- JS学习-Canvas
Canvas Canvas API 提供了一个通过JavaScript 和 HTML的<canvas>元素来绘制图形的方式.它可以用于动画.游戏画面.数据可视化.图片编辑以及实时视频处理等 ...
- css实现文字多余显示省略号
只显示一行文字 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 显示多行文字 word-break:break-all; ...
- iOS开发之运行报错 dyld: Library not loaded: *** Reason: image not found
xcode运行报错 dyld: Library not loaded: @rpath/Flutter.framework/Flutter Referenced from: /private/var ...
- CSS3-transform位移实现双开门效果
transform可以用于实现位移,旋转,缩放等效果. 位移:transform: translate(水平距离,垂直距离); 这里先借助其位移属性实现双开门的效果,鼠标hover的时候最上面的图片向 ...
- memoのMac折腾记录
memoのMac折腾记录 纯粹是一些零散的学习记录.有错误欢迎指出. 我就是一鼠标党,不会Linux. zsh加载 惭愧,最近才知道bash和zsh是两个不同的终端... 之前看一些mac设置系统环境 ...
- B - WeirdSort
B - WeirdSort 思路:经过认真的审题,你会发现,这只是个冒泡的变形,我们建立两个数组,然后用一个数组里面的数字确定位置,然后冒泡就行了.最后抖机灵用了个is_sorted,判断数组里面数字 ...
- Linux文本文件及处理工具
Linux中的文本信息 文本文件 C语言,Java语言等编程文件的源程序语言 文本格式的数据文件 文本格式的文字信息 在Linux下一切皆文件 everything is file,包括目录也是文件的 ...