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

题目:

实验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. 大神的Blog挂了,从Bing快照里复制过来的备份

    UWidget封装SWidget到UMG 2015年8月30日0 为了使用UMG中的一些高级或便利特性,需要将制作好的Slate控件封装到UWidget中去. 当前UE4版本4.8.3. 将Slate ...

  2. mongo日志切割脚本

    两种mongo日志切割脚本 vim /etc/logrotate.d/mongodb /home/mongodb/mongolog/mongod.log { daily rotate 7 compre ...

  3. UTF8存储与显示

    存储肯定是二进制存储,同一个字符(汉子)在不同的字符集下有对应的值,一个字符集相当于一个密码表,键名为字符,键值为二进制数(可表示为十进制,十六进制) UTF8是一个unicode字符集的编码规则,也 ...

  4. MyBatis之四:调用存储过程含分页、输入输出参数

    在前面分别讲解了通过mybatis执行简单的增删改,多表联合查询,那么自然不能缺少存储过程调用,而且还带分页功能. 注意:表结构参见上篇讲解联合查询的表. 一.查询某班级以及该班级下面所有学生的记录 ...

  5. Hadoop2.4.1 MapReduce通过Map端shuffle(Combiner)完成数据去重

    package com.bank.service; import java.io.IOException; import org.apache.hadoop.conf.Configuration;im ...

  6. 44个JAVA代码质量管理工具(转)

    1. CodePro AnalytixIt’s a great tool (Eclipse plugin) for improving software quality. It has the nex ...

  7. HTML5学习之Web存储

    在客户端存储数据 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前, ...

  8. STM32外部中断线编程

    #include "ExtiConfig.h" unsigned char key1Down = 0; unsigned char key2Down = 0; /********* ...

  9. 4c语言的第0次作业

    1.你认为大学的学习生活.同学关系.师生关系应该是怎样? 我认为大学的学习生活应该是充实有意义的,有对学习的激情又有与伙伴相知的愉悦. 我认为同学关系应该是互相尊重,互相学习,坦诚相待. 我认为师生关 ...

  10. 每日英语:Mercedes Sheds Its &#39;Old&#39; Design

    Daimler AG's flagship Mercedes-Benz often gets the rap for being an 'old man's car.' More unusual is ...