首页 > 其他 > 详细

第十五章 链表

时间:2014-06-16 08:33:57      阅读:347      评论:0      收藏:0      [点我收藏+]

1. 什么是链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。

2. 结构体链表

struct book

{    int num;

      float price;

      book * next;

}; //默认公有,而class默认私有

3. 静态链表

 

4. 动态链表

5. 动态链表的建立

先建立一个节点(两部分①数据部分②next指针)。再建立三个指针head(外面建立),p1,p2;

6. 解决输入字符造成死循环的问题

解决方法:

① cin.clear();

    cin.ignore();

cin.ignore() 接受两个参数,第一个参数是你要清楚输入缓冲区中元素的个数(默认时为1),第二个参数的作用:在清楚缓冲区时如果遇到的元素与参数相同时则停止此操作。 cin.sync() 用于清楚整个输入流的缓冲区 cin.clear() 用于重置错误标志(默认时),cin出现错误时用它来重置。(一般清楚缓冲区之前,程序前面会出现cin错误。最好在清楚了缓冲区后重置错误位)

② bool check(string str)

{

      int i,j=0;           //增加变量j来保存"."出现的次数

      if (str[0]==‘.‘)    //假如第一个字符是‘.‘

           return false;    //不是数字,返回false

 for(i = 0;i<str.length();i++)  //增加for循环来检测"."出现的次数

//str.length()  调用string类测量str的长度

      {

           if((str[i]==‘.‘)) //假如"."出现

                 j++;            //将j自加

      }

      if (j>1)                 //假如"."超过1个

           return  false;     //不是数字,返回false

      for(i = 0;i<str.length();i++)

           if((str[i]>‘9‘ || str[i]<‘0‘)&&(str[i]!=‘.‘))//如果不是0到9或者小数点的话就返回false

           return false;

      return true;

}

atoi        //char型转换成int型

atof           //char型转换成float型

c_str()       //c++类string转换成c类

      // c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 

这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

7. 动态链表的显示

8. 动态链表的删除

9. 动态链表的插入

10. 演示尾插法

11. 前插法

12. 中间插法

13. 链表统计

14. 使用链表

bubuko.com,布布扣
/**
数组与链表的区别:数组易随机访问,链表易插入和删除
链表组成:储存数据元素的数据域,储存下一结点地址的指针域
链表易于插入与删除
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 checknum(string x);                //检测图书编号输入是否正确
    bool checkprice(string y);                //检测图书价格输入是否正确
};
void list::insertlist(int bnum,float bprice)//插入  操作对象时Pb指向的节点
{
    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))//遍历满足条件的结点 就等于Pm++
        {
            Pf = Pm;
            Pm = Pm->next;
        }
        if(bnum >= Pm->num)//尾插 只要上面的wile循环会停 这个if就不会进来
        {
            Pm->next = Pb;
            Pb->next = NULL;
        }
        else            //中插
        {
            Pf->next = Pb;
            Pb->next = Pm;
        }
    }

}
void list::deletelist(int dnum)//删除        操作对象时Pm指向的节点
{
    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)//Pm++
        {
            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;        //Pm++
    }
    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::checknum(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::checkprice(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;                    //此处不能用cin.get();
        cin.clear();
        cin.ignore();            //
        switch(n)
        {
        case 1:A_student.outputlist();
            break;
        case 2:do
            {
                cout<<"您要输入的图书编号是:"<<endl;
                cin>>xnum;
            }while(!A_student.checknum(xnum));
            do
            {
                cout<<"您要输入的图书价格是:"<<endl;
                cin>>xprice;
            }while(!A_student.checkprice(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.checknum(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,布布扣

15.1  链表使用案例之走迷宫

 

15.2  设置项目

15.3  创建派生类

创建一个win32窗口:

①创建Win32 Application→②添加头文件夹并在其添加MFC的头文件名(#inlcude”afxwin.h”)→③创建资源文件(没有外部资源也要创建)→④设置资源包含(添加外部资源的头文件名)→⑤设置类向导→⑥设置项目

15.4  定义应用程序对象

 

15.5  初始化函数

 

15.6  创建窗口

 

15.7  显示窗口

 

15.8  更新窗口

15.9   GDI类

15.10  加载位图

15.11   LoadImage函数

15.12  句柄是什么

15.13  显示图片

15.19  小知识点

15.20  动画

15.24  键盘控制人物移动

15.28  迷宫墙壁

15.32  走迷宫

15.33  用链表记录行走路线

本章总结:

 

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

第十五章 链表

原文:http://www.cnblogs.com/zenseven/p/3783676.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!