第十五章 链表


/**
数组与链表的区别:数组易随机访问,链表易插入和删除
链表组成:储存数据元素的数据域,储存下一结点地址的指针域
链表易于插入与删除
lists 的用法?????????????????????
*/
//建立一个图书链表
#include<iostream>
#include <string>
using namespace std;
struct book //第一步: 用于建立节点。 class 默认为私有 struct 默认为公有
//节点组成:①数据域 ②指针域(*next)
{
int num; //图书编号
float price; //图书价格
book *next;
};
class list
{
private:
book *head;
public:
list(){head = NULL;}
void insertlist(int bnum,float bprice); //插入
void deletelist(int dnum); //删除
void outputlist(); //显示
void countlist(); //统计链表数
bool check1(string x); //检测图书编号输入是否正确
bool check2(string y); //检测图书价格输入是否正确
};
void list::insertlist(int bnum,float bprice)//插入
{
book *Pf,*Pm,*Pb;//Pf为上一结点指针,Pm为本结点指针,Pb为要被插入结点指针
Pm=head;//将本结点Pm设为第一个结点(只是为了方便阅读,其实完全可以用head代替)
Pb= new book; //建立要插入的结点
Pb->num = bnum;
Pb->price = bprice;
//error*******if(head->num == NULL) //因为没有head->num这个东西
if(head == NULL)//若为空链表,则将被插入结点设为第一个结点(建立第一个结点)
{
head = Pb;
Pb->next = NULL;
}
else if(bnum < head->num)//若要插入的结点编号小于第一个结点的编号(前插)
{
Pb->next = head;
head = Pb;
}
else
{
while((bnum >= Pm->num) && (Pm->next != NULL))//遍历满足条件的结点
{
Pf = Pm;
Pm = Pm->next;
}
if(bnum >= Pm->num)//尾插
{
Pm->next = Pb;
Pb->next = NULL;
}
else //中插
{
Pf->next = Pb;
Pb->next = Pm;
}
}

}
void list::deletelist(int dnum)
{
book *Pf,*Pm;//Pf为上一结点指针,Pm为本结点指针
Pm=head;
if(head == NULL) // 若为空结点
{
cout<<"图书储存为空"<<endl;
return;
}
if(Pm->num == dnum) //若被删除的为第一个指针
{
head=Pm->next;
delete Pm;
}
else
{
while(Pm->num != dnum && Pm->next != NULL)
{
Pf = Pm;
Pm = Pm->next;
}
if(Pm->num == dnum)
{
Pf->next = Pm->next;
delete Pm;
}
else
{
cout<<"没有你要删除的图书"<<endl;
}
}
}
void list::outputlist()
{
book *Pm;
Pm = head;
if(head == NULL)
{
cout<<"链表为空链表,请选择是否插入链表"<<endl;
return;
}
while(Pm != NULL)
{
cout<<"图书编号:"<<Pm->num<<‘\t‘;

cout<<"图书价格:"<<Pm->price<<endl;
Pm=Pm->next;
}
cout<<endl;
}
void list::countlist()
{
book *Pm;
Pm = head;
int countnum = 0;
while(Pm != NULL)
{
countnum++;
Pm=Pm->next;
}
cout<<"图书统计为:"<<countnum<<"本"<<endl;
cout<<endl;

}
bool list::check1(string x)
{
int i,j=0; //增加变量j来保存"."出现的次数

for(i = 0;i<x.length();i++)
{
if(x[i]>‘9‘ || x[i]<‘0‘)//如果不是0到9或者小数点的话就返回false
{
cout<<"你输入的不是纯数字,请重新输入"<<endl;
return false;
}
}
return true;
}
bool list::check2(string y)
{
int i,j=0; //增加变量j来保存"."出现的次数
/*if (y[0]==‘.‘) //假如第一个字符是‘.‘
{
cout<<"你输入的不是数字,请重新输入"<<endl;
return false; //不是数字,返回false
}*/
for(i = 0;i<y.length();i++) //增加for循环来检测"."出现的次数
{
if((y[i]==‘.‘)) //假如"."出现
j++; //将j自加
}
if (j>1) //假如"."超过1个
{
cout<<"你输入的不是数字,请重新输入"<<endl;
return false; //不是数字,返回false
}

for(i = 0;i<y.length();i++)
{
if((y[i]>‘9‘ || y[i]<‘0‘)&&(y[i]!=‘.‘))//如果不是0到9或者小数点的话就返回false
{
cout<<"你输入的不是数字,请重新输入"<<endl;
return false;
}
}
return true;
}

int main()
{
list A_student;
cout<<"创建一个叫A_student的图书链表"<<endl;
while(1)
{
cout<<"1-显示列表"<<"2-插入列表"<<"3-删除列表"<<"4-统计列表"<<"0-退出列表"<<endl;
int n;
string xnum,xprice;
bool breaklist=false;
cin>>n;
switch(n)
{
case 1:A_student.outputlist();
break;
case 2:do
{
cout<<"您要输入的图书编号是:"<<endl;
cin>>xnum;
}while(!A_student.check1(xnum));
do
{
cout<<"您要输入的图书价格是:"<<endl;
cin>>xprice;
}while(!A_student.check2(xprice));
A_student.insertlist(atoi(xnum.c_str()),atof(xprice.c_str()));//将string型转化被asii型

break;//此处要使用多线程,才能保证连续插入列表
case 3:do
{
cout<<"您要删除的图书编号是:"<<endl;
cin>>xnum;
}while(!A_student.check1(xnum));
A_student.deletelist(atoi(xnum.c_str()));
break;
case 4:A_student.countlist();
break;
case 0: breaklist=true;
break;
default:cout<<"请输入菜单内的数字:"<<endl;
break;
}
if(breaklist == true)
break;
}
return 0;
}

第十五章 链表,布布扣,bubuko.com

时间: 2024-10-10 09:54:18

第十五章 链表的相关文章

《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记

一.锁的劣势 锁定后如果未释放,再次请求锁时会造成阻塞,多线程调度通常遇到阻塞会进行上下文切换,造成更多的开销. 在挂起与恢复线程等过程中存在着很大的开销,并且通常存在着较长时间的中断. 锁可能导致优先级反转,即使较高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别. 二.硬件对并发的支持 处理器填写了一些特殊指令,例如:比较并交换.关联加载/条件存储. 1 比较并交换 CAS的含义是:"我认为V的值应该为A,如果是,那么将V的值更新为B,否则不需要修

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

java(第十五章)

第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase(

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第十五章 文正学院成绩录入系统

这是13年上半年给文正学院做的一个成绩录入系统,只需要实现成绩录入的功能,嫁接到文正教务系统中.实现的功能如图所示. 王川 2014/5/30 第十五章 文正学院成绩录入系统,布布扣,bubuko.com

C++ Primer Plus学习:第十五章

第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 . 友元成员函数 表 0-2 class Tv; //前向声明 class Remote { public: void chanup(Tv &t); } class Tv { public: friend void Remote::set_chan(Tv& t, int c); } 异常

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu