太简单了,直接贴题目然后上代码。

题目:

实验2

2.1 实验目的

熟练掌握线性表的链式存储结构。

熟练掌握单链表的有关算法设计。

根据具体问题的需要,设计出合理的表示数据的链式存储结构,并设计相关算法。

2.2 实验要求

本次实验中的链表结构指带头结点的单链表;

单链表结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

比如存储、算法实现放入文件:linkedList.h

实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

程序有适当的注释。

2.3 实验任务

编写算法实现下列问题的求解。

<1>尾插法创建单链表,打印创建结果。

<2>头插法创建单链表,打印创建结果。

<3>销毁单链表。

<4>求链表长度。

<5>求单链表中第i个元素(函数),若不存在,报错。

实验测试数据基本要求:

第一组数据:单链表长度n≥10,i分别为5,n,0,n+1,n+2

第二组数据:单链表长度n=0,i分别为0,2

<6>在第i个结点前插入值为x的结点。

实验测试数据基本要求:

第一组数据:单链表长度n≥10,x=100,  i分别为5,n,n+1,0,1,n+2

第二组数据:单链表长度n=0,x=100,i=5

<7>链表中查找元素值为x的结点,成功返回结点指针,失败报错。

实验测试数据基本要求:

单链表元素为(1,3,6,10,15,16,17,18,19,20)

x=1,17,20,88

<8>删除单链表中第i个元素结点。

实验测试数据基本要求:

第一组数据:单链表长度n≥10,i分别为5,n,1,n+1,0

第二组数据:单链表长度n=0, i=5

<9>在一个递增有序的单链表L中插入一个值为x的元素,并保持其递增有序特性。

实验测试数据基本要求:

单链表元素为(10,20,30,40,50,60,70,80,90,100),

x分别为25,85,110和8

<10>将单链表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的单链表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。

实验测试数据基本要求:

第一组数据:单链表元素为(1,2,3,4,5,6,7,8,9,10,20,30,40,50,60)

第二组数据:单链表元素为(10,20,30,40,50,60,70,80,90,100)

代码:

 // stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
// #if !defined(AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_)
#define AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include <stdc++.h> using namespace std; typedef int elementType;
typedef struct node
{
elementType data;
node* next;
}LList, *PList; // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__195DB73A_A23D_4A80_A4F5_2F4FC5141CBC__INCLUDED_)
 // linkedList1.h: interface for the linkedList class.
//
////////////////////////////////////////////////////////////////////// #if !defined(AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_)
#define AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include "StdAfx.h" using namespace std; class linkedList
{
public:
linkedList();//构造函数
virtual ~linkedList();//析构函数,销毁单链表
bool createLinkedListRail( int length );//尾插法构建单链表
bool createLinkedListFront( int length );//头插法构建单链表
void addLinkedListNodeLast( int value );//警告:必须初始化才能使用!
//我尝试判断调用对象的链表是否初始化来作为是否调用该函数的依据,结果失败:无论如何判断,总是不能在零节点时插入
bool initiateLinkedList();//初始化单链表
bool isEmpty();//判断单链表是否为空
bool getElementByPosition( int pos, int& value );//求单链表中第pos个元素(函数),若不存在,报错
bool insertListByPosition( int pos, int value );//在第pos个结点前插入值为value的结点
bool getElementByValue( int& pos, int value );//链表中查找元素值为x的结点,成功返回结点指针,失败报错。
bool removeListNodeByPosition( int pos, int& value );//删除单链表中第pos个元素结点
bool insertListSort( int value );//在一个递增有序的单链表L中插入一个值为value的元素,并保持其递增有序特性
bool oddEvenSort( linkedList& LA,linkedList& LB );//将调用单链表中的元素按奇偶性分配給被调用的单链表LA与LB
void printLinkedList();//打印单链表
int linkedListLength();//返回单链表长度
private:
LList *head;
int len;
}; #endif // !defined(AFX_LINKEDLIST1_H__4C3F34C9_D36C_43D6_97CF_A8E55FD6BD7D__INCLUDED_)
 // linkedList1.cpp: implementation of the linkedList class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "linkedList1.h" //////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// linkedList::linkedList()
{
head = NULL;
len = ;
} linkedList::~linkedList()
{
LList* tmp = head;
//for( int i = 0; i < len; i ++ )
while( tmp->next )
{
LList *q = tmp;
tmp = tmp->next;
delete q;
}
} bool linkedList::initiateLinkedList()
{
std::ios::sync_with_stdio(false);
head = new LList;
if( !head )
{
cout << "初始化失败!" << endl;
return false;
}
head->next = NULL;
return true;
} bool linkedList::createLinkedListRail( int length )
{
std::ios::sync_with_stdio(false);
initiateLinkedList();
LList* rail = head;
for( int i = ; i <= length; i ++ )
{
LList* tmp = new LList;
int num;
cin >> num;
//num = i + 1;
tmp->data = num;
tmp->next = rail->next;
rail->next = tmp;
rail = tmp;
len ++;
}
return true;
} bool linkedList::createLinkedListFront( int length )
{
std::ios::sync_with_stdio(false);
initiateLinkedList();
for( int i = ; i < length; i ++ )
{
int num;
cin >> num;
//num = i + 1;
LList* tmp = new LList;
tmp->data = num;
tmp->next = head->next;
head->next = tmp;
len ++;
}
return true;
} void linkedList::addLinkedListNodeLast( int value )
{
//ios::sync_with_stdio(false); LList* tmp = head;
LList* last = NULL;
while(tmp)
{
last = tmp;
tmp = tmp->next;
}
LList* PNew = new LList;
PNew->data = value;
PNew->next = NULL;
last->next = PNew;
len ++;
} bool linkedList::isEmpty()
{
return head->next == NULL;
} void linkedList::printLinkedList()
{
std::ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "空链表,无法打印!" << endl;
return;
}
LList* tmp = head->next;
int column = ;
while(tmp)
{
cout << setiosflags(ios::left) << setw() << tmp->data << " ";
column ++;
if( column % == )
cout << endl;
tmp = tmp->next;
}
cout << endl;
} int linkedList::linkedListLength()
{
if( isEmpty() )
{
cout << "空链表!" << endl;
return -;
}
int l = ;
LList* tmp = head->next;
while(tmp)
{
tmp = tmp->next;
l ++;
}
return l;
//return len;
} bool linkedList::getElementByPosition( int pos, int& value )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "链表为空!获取元素失败!" << endl;
return false;
}
if( pos > len )
{
cout << "位置大于表长!获取元素失败!" << endl;
return false;
}
if( pos <= )
{
cout << "位置必须大于0!获取元素失败!" << endl;
return false;
}
int index = ;
LList* tmp = head;
while(tmp)
{
if( index == pos )
{
//cout << tmp->data;
value = tmp->data;
return true;
}
tmp = tmp->next;
index ++;
}
return true;
} bool linkedList::insertListByPosition( int pos, int value )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "链表为空!插入元素失败!" << endl;
return false;
}
else if( pos > len )
{
cout << "位置大于表长且差值大于1!删除元素失败!" << endl;
return false;
}
else if( pos == len )
{
cout << "将会直接把新节点接在链表尾部!" << endl;
addLinkedListNodeLast( value );
return true;
}
else if( pos <= )
{
cout << "位置必须大于0!插入元素失败!" << endl;
return false;
}
int index = ;
LList* tmp = head;
while( index != pos - && tmp )
{
index ++;
tmp = tmp->next;
}
if( tmp == NULL )
{
cout << "位置大于表长且不在表长的后一位!插入元素失败!" << endl;
return false;
}
LList* PNew = new LList;
PNew->data = value;
PNew->next = tmp->next;
tmp->next = PNew;
len ++;
return true;
} bool linkedList::getElementByValue( int& pos, int value )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "链表为空!获取元素失败!" << endl;
return false;
}
int index = ;
LList* tmp = head->next;
while(tmp)
{
if( tmp->data == value )
{
pos = index;
return true;
}
tmp = tmp->next;
index ++;
}
return false;
} bool linkedList::removeListNodeByPosition( int pos, int& value )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "链表为空!删除元素失败!" << endl;
return false;
}
if( pos > len )
{
cout << "位置大于表长!删除元素失败!" << endl;
return false;
}
if( pos <= )
{
cout << "位置必须大于0!删除元素失败!" << endl;
return false;
}
LList* tmp = head;
int index = ;
while( index != pos - && tmp )
{
tmp = tmp->next;
index ++;
}
LList* PDel = tmp->next;
value = PDel->data;
tmp->next = tmp->next->next;
delete PDel;
len --;
return true;
} bool linkedList::insertListSort( int value )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "链表为空!插入元素失败!" << endl;
return false;
}
LList* tmp = head;
while( tmp->next && tmp->next->data < value )//下一个节点的data比value小就继续循环
//写成下面这样导致比最后一个节点的data大的value无法插入!因为循环结束时tmp->next为NULL,无法插入。
//while( tmp && tmp->next->data < value )
{
//if( tmp->data < value )
tmp = tmp->next;
}
LList* PNew = new LList;
PNew->data = value;
PNew->next = tmp->next;
tmp->next = PNew;
return true;
} bool linkedList::oddEvenSort( linkedList& LA,linkedList& LB )
{
ios::sync_with_stdio(false);
if( isEmpty() )
{
cout << "原链表为空!分配元素失败!" << endl;
return false;
}
//if( !LA.head->next && !LB.head->next )
if( !LA.head && !LB.head )
{
LA.initiateLinkedList();
LB.initiateLinkedList();
}
LList* tmp = head->next;
while(tmp)
{
if( tmp->data >= && ( tmp->data & ) )
LA.addLinkedListNodeLast( tmp->data );
//else if( tmp->data >= 0 && !( tmp->data & 1 ) )
else
LB.addLinkedListNodeLast( tmp->data );
tmp = tmp->next;
}
return true;
}
 // LinkedList.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "linkedList1.h" int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
freopen( "1.in", "r", stdin ); linkedList L1;//, L2;
int n;
cin >> n;
L1.createLinkedListFront(n);
cout << "原表表长为:" << endl;
cout << L1.linkedListLength() << endl;
cout << "原表元素为:" << endl;
L1.printLinkedList();
/*
L1.~linkedList();
cout << "现表表长为:" << endl;
cout << L1.linkedListLength() << endl;
cout << "现表元素为:" << endl;
L1.printLinkedList();
//L2.createLinkedListFront(5);
//cout << L2.linkedListLength() << endl;
//L2.printLinkedList();
22
30 70 92 91 15 47 84 10 43 34 9 62 60 26 79 96 38 4 92 24 25 5 linkedList L3;
int n;
cin >> n;
L3.createLinkedListRail(n);
cout << "原表表长为:" << endl;
cout << L3.linkedListLength() << endl;
cout << "原表元素为:" << endl;
L3.printLinkedList();//5,n,0,n+1,n+2 int value = -100;
int num;
cin >> num;
for( int i = 0; i < num; i ++ )
{
int pos;
cin >> pos;
if( L3.getElementByPosition( pos, value ) )
{
cout << "第 " << pos << " 个元素的值为:" << value << endl; }
else
cout << "不存在位置为 " << pos << " 的元素!" << endl;
} linkedList L4;
int n;
cin >> n;
L4.createLinkedListRail(n);
cout << "原表表长为:" << endl;
cout << L4.linkedListLength() << endl;
cout << "原表元素为:" << endl;
L4.printLinkedList();//x=100, i分别为5,n,n+1,0,1,n+2
int value = 100;
int num;
cin >> num;
for( int i = 0; i < num; i ++ )
{
int pos;
cin >> pos;
if( L4.insertListByPosition( pos, value ) )
{
cout << "value = " << value << " 的值已插在 pos = " << pos << "的位置上!" << endl;
cout << "现表表长为:" << endl;
cout << L4.linkedListLength() << endl;
cout << "现表元素为:" << endl;
L4.printLinkedList();
}
} linkedList L5;
int n;
cin >> n;
L5.createLinkedListRail(n);
cout << "原表表长为:" << endl;
cout << L5.linkedListLength() << endl;
cout << "原表元素为:" << endl;
L5.printLinkedList();
int index = -1;
//1,17,20,88
for( int i = 0; i < 4; i ++ )
{
int value;
cin >> value;
if( L5.getElementByValue( index, value ) )
{
cout << "pos = " << index << ", value = " << 1 << endl;
} else
{
cout << "链表中不存在值为 " << value << " 的值" << endl;
}
} linkedList L6;
int n;
cin >> n;
L6.createLinkedListRail(n);
L6.printLinkedList();
cout << L6.linkedListLength() << endl;
int value = -1;
//5,n,1,n+1,0
if( L6.removeListNodeByPosition( 5, value ) )
{
cout << "pos = " << 5 << ", value = " << value << "已删除!" << endl;
}
L6.printLinkedList();
if( L6.removeListNodeByPosition( n , value ) )
{
cout << "pos = " << n << ", value = " << value << "已删除!" << endl;
}
else
{
cout << "不存在位置等于 " << n << " 的元素!" << endl;
}
L6.printLinkedList();
if( L6.removeListNodeByPosition( 1, value ) )
{
cout << "pos = " << 1 << ", value = " << value << "已删除!" << endl;
}
L6.printLinkedList();
if( L6.removeListNodeByPosition( n + 1, value ) )
{
cout << "pos = " << n + 1 << ", value = " << value << "已删除!" << endl;
}
else
{
cout << "不存在位置等于 " << n + 1 << " 的元素!" << endl;
}
L6.printLinkedList();
if( L6.removeListNodeByPosition( 0, value ) )
{
cout << "pos = " << 0 << ", value = " << value << "已删除!" << endl;
}
else
{
cout << "不存在位置等于 " << 0 << " 的元素!" << endl;
}
L6.printLinkedList(); linkedList L7;
int n;
cin >> n;
L7.createLinkedListRail(n);
cout << "原表表长为:" << endl;
cout << L7.linkedListLength() << endl;
cout << "原表元素为:" << endl;
L7.printLinkedList(); //int value = -1;
//5,n,1,n+1,0
for( int i = 0; i < 1; i ++ )
{
int value;
cin >> value;
if( L7.removeListNodeByPosition( 5, value ) )
{
cout << "pos = " << 5 << ", value = " << value << "已删除!" << endl;
cout << "现表表长为:" << endl;
cout << L7.linkedListLength() << endl;
cout << "现表元素为:" << endl;
L7.printLinkedList();
}
if( L7.removeListNodeByPosition( n , value ) )
{
cout << "pos = " << n << ", value = " << value << "已删除!" << endl;
}
else
{
cout << "不存在位置等于 " << n << " 的元素!" << endl;
}
} linkedList L8;
int n;
cin >> n;
L8.createLinkedListRail(n);
cout << "原表表长为:" << endl;
cout << L8.linkedListLength() << endl; cout << "原表元素为:" << endl;
L8.printLinkedList();
int value;
for( int i = 0; i < 4; i ++ )
{
cin >> value;
if( L8.insertListSort(value) )
{
cout << "插入元素 " << value << " 后表长为:" << endl;
cout << L8.linkedListLength() << endl;
cout << "插入元素 " << value << " 表元素为:" << endl;
L8.printLinkedList();
}
else
cout << "Error!" << endl;
} int n;
linkedList L9, LA, LB;
cin >> n;
L9.createLinkedListRail(n);
//LA.initiateLinkedList(), LB.initiateLinkedList();
cout << "原链表表长为:" << endl;
cout << L9.linkedListLength() << endl;
cout << "原链表元素为:" << endl;
L9.printLinkedList();
L9.oddEvenSort( LA, LB );
cout << "奇数链表表长为:" << endl;
cout << LA.linkedListLength() << endl;
cout << "奇数链表元素为:" << endl;
LA.printLinkedList();
cout << "偶数链表表长为:" << endl;
cout << LB.linkedListLength() << endl;
cout << "偶数链表元素为:" << endl;
LB.printLinkedList();
*/
return ;
}

图1 测试(1)

图2 测试(2)

图3 测试(3)

图4 测试(4)

图5 测试(5)

图6 测试(5)

图7 测试(6)

图8 测试(6)

图9 测试(7)

图10 测试(8)

图11 测试(8)

图12 测试(9)

图13 测试(10)

图14 测试(10)

数据结构实验2:C++实现单链表类的更多相关文章

  1. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  2. 数据结构-单链表-类定义2-C++

    上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...

  3. 【Java】 大话数据结构(2) 线性表之单链表

    本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...

  4. [C++]数据结构:线性表之(单)链表

    一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...

  5. 【数据结构和算法】001 单链表 LinkedList

    一.单链表(LinkedList)介绍和内存布局 链表是有序的列表,它在内存中的实际存储结构如下: 看上去虽然无序,但他是靠灭个链表节点元素的地址和next域来分清首尾相连的顺序,如下图所示,由头指针 ...

  6. 数据结构(C实现)------- 单链表

    在单链表中,每个结点包括两部分:存放每个数据元素本身信息的数据域和存放其直接后继存储位置的指针域. 单链表结点的类型描写叙述: typedef int ElemType; typedef struct ...

  7. 数据结构与算法-python描述-单链表

    # coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元 ...

  8. 重学数据结构(三)——使用单链表实现LRU淘汰缓存机制

    使用单链表实现LRU(Least Recently Used)淘汰缓存机制 需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素. 当元素被访问到时,会添加进缓存(也就是这个单链表中). 如果这 ...

  9. 数据结构-单链表-类定义C++

    原理可访问https://www.cnblogs.com/yang901112/p/11674333.html 头文件 #ifndef RLIST_H #define RLIST_H #include ...

随机推荐

  1. 洛谷 P3312 [SDOI2014]数表

    式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...

  2. 题解报告:NYOJ #737 石子合并(一)(区间dp)

    描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...

  3. windows密码长度最小值改不了

    控制台输入gpedit.msc或者在“开始→控制面板→管理工具→本地安全策略→账户策略→密码策略→密码长度最小值”中修改不了,是灰色的,不让修改 用命令行可以修改开始-->运行-->输入& ...

  4. AJPFX关于学习java遇到的问题:对算法和数据结构不熟悉

    为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上. 既然“数据结构和算 ...

  5. PHP设计模式 观察者模式(Observer)

    定义 当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新. 模式要点 Event:事件 Trigger() 触发新的事件 abstract EventGenerator 事件产生者 Fu ...

  6. 013、BOM对象的应用

    BOM结构图如下: DOM结构图如下: BOM和DOM BOM,Bowser Object Model浏览器对象模型.提供了访问和操作浏览器各组件的途径或方法. 比如:Navigator对象:浏览器的 ...

  7. lavarel功能总结

    详细可参见笔记:laraval学习笔记(二) 路由 route 绑定模型,绑定参数 模版 blade .blade.php后缀,有laravel自己的模版语法 模型 model 如果用create创建 ...

  8. webuploader上传工具

    http://fex.baidu.com/webuploader/getting-started.html#显示用户选择 Html部分 首先准备dom结构,包含存放文件信息的容器.选择按钮和上传按钮三 ...

  9. java读取大文件 超大文件的几种方法

    java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能       import java.io.BufferedReader; import java.io.File; import jav ...

  10. 数据库管理系统X

    大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约 ...