单链表(以书本信息为例)

#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
#include<cstdlib>

using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;

struct Book{
   string id;//ISBN
   string name;//书名
   double price;//定价
};

typedef struct LNode{
   Book data;//节点的数据域
   struct LNode *next;//节点的指针域
}LNode,*LinkList;// LinkLIst是指向LNode的指针类型

string head_1,head_2,head_3;
int length;
//单链表的初始化
Status InitList_L(LinkList &L){
   L=new LNode;//生成新的节点为头结点
   L->next=NULL;//头节点的指针域置空
   return OK;
}
//单链表的取值
Status GetElem_L(LinkList L,int i,Book &e){
    int j;//在带头结点的单链表L中查找第i个元素
    //用e返回L中第i个数据元素的值
    LinkList p;
    p=L->next;
    j=1;
    while(j<i&&p){//顺链域向后扫描,直到p指向第i个元素或p为空
        p=p->next;//p指向想一个结点
        ++j;//计速器j加1
    }
    if(!p||j>i)//值不合法或i>n 或i<=0
        return ERROR;
    e=p->data;//取第i个结点的数据域
    return OK;
}
//按值查找
LNode *LocateElem_L(LinkList L,double e){
    LinkList p;
    p=L->next;
    while(p&&p->data.price!=e)//顺链域向后扫描,直到p为空或p所指结点为所要结点
        p=p->next;//指向下一个结点
    return p;//查找成功返回值为e的结点地址p,查找失败p为null
}


Status ListInsert_L(LinkList &L,int i,Book &e){
    //在带头结点的单链表L中第i个位置插入值为e的新结点
    int j;
    LinkList p,s;
    p=L;
    j=0;
    while(p&&j<i-1){
        p=p->next;
        ++j;
    }//查找第i个结点,p指向该节点
    if(!p||j>i-1) return ERROR;
    s=new LNode;
    s->data=e;//将e的数据保存到新建的结点s中
    s->next=p->next;//让s指向第i个结点指的下一个结点
    p->next=s;//让当前i的节点指向新结点s
    ++length;// 链表长度+1
    return OK;
}

//删除单链表第i个结点
Status ListDelete_L(LinkList &L,int i){
    LinkList p,q;
    int j;
    p=L;
    j=0;
    while((p->next)&&(j<i-1)){//查找第i个结点,p指向该结点
        p=p->next;
        ++j;
    }
    if(!(p->next)||(j>i-1))
        return ERROR;//当i>n或i<1时,删除位置不合理
    q=p->next;//保存被删除结点的地址
    p->next=q->next;//改变删除结点前驱结点的指针域
    delete q;//释放删除结点的空间
    --length;
    return OK;
}

//前插法创建单链表
void CreateList_H(LinkList &L,int n){
//逆位序输入n个元素的值,建立到头结点的单链表L;
   LinkList p;
   L=new LNode;
   L->next=NULL;//先建立一个带头结点的空链表
   length=0;
   fstream file;
   file.open("book.txt");
   if(!file){
    cout<<"未找到相关文件,无法打开"<<endl;
    exit(ERROR);
   }
   file>>head_1>>head_2>>head_3;
   while(!file.eof()){
    p=new LNode;//生成新节点*p
    file>>p->data.id>>p->data.name>>p->data.price;//给结点赋值
    p->next=L->next;//末尾结点指向NULL
    L->next=p;//L结点指向p
    length++;//长度+1;
   }
   file.close();
}
//后插法插入输入数据
void CreateList_R(LinkList &L,int n){
    LinkList p,r;
    L=new LNode;
    L->next=NULL;
    r=L;
    length=0;
    fstream file;
    file.open("book.txt");
    if(!file){
        cout<<"未找到相关文件,无法打开"<<endl;
        exit(ERROR);
    }
    file>>head_1>>head_2>>head_3;
    while(!file.eof()){
        p=new LNode;
        file>>p->data.id>>p->data.name>>p->data.price;
        p->next=NULL;
        r->next=p;//将新节点*p插入尾结点*r之后
        r=p;//指向新的尾结点*p
        length++;
    }
    file.close();
}

int main(){
    int a,n,choose;
    double price;
    Book e;
    LinkList L,p;
    cout<<"1.建立"<<endl;
    cout<<"2.输入"<<endl;
    cout<<"3.取值"<<endl;
    cout<<"4.查找"<<endl;
    cout<<"5.插入"<<endl;
    cout<<"6.删除"<<endl;
    cout<<"7.输出"<<endl;
    cout<<"0.退出"<<endl;
    choose=-1;
    while(choose!=0){
        cout<<"请选择:";
        cin>>choose;
        switch(choose){
        case 1:if(InitList_L(L))
        cout<<"成功建立单链表\n\n";
        break;
        case 2:
            CreateList_R(L,length);
            cout<<"输入book.txt信息完毕\n\n";
            break;
        case 3:
            cout<<"请输入一个位置用来取值";
            cin>>a;
            if(GetElem_L(L,a,e)){
                cout<<"查找成功\n";
                cout<<"第"<<a<<"本图书的信息是: \n";
                cout<<left<<setw(15)<<e.id<<"\t"<<left
                <<setw(50)<<e.name<<"\t"<<left<<setw(5)<<e.price
                <<endl;
            }else
               cout<<"查找失败\n\n";
               break;
        case 4:
            cout<<"请输入要查找的价格:";
            cin>>price;
            if(LocateElem_L(L,price)!=NULL){
                cout<<"查找成功\n";
                cout<<"该价格对应的书名为: "<<LocateElem_L(L,price)->data.name<<endl<<endl;
            }else cout<<"查找失败!定价"<<price<<"没有找到\n\n";
            break;
        case 5:
            cout<<"请输入插入的位置和书的信息,包括:编号,书名,价格 (用空格隔开):";
            cin>>a;
            cin>>e.id>>e.name>>e.price;
            if(ListInsert_L(L,a,e))
                cout<<"插入成功\n\n";
            else cout<<"插入失败\n\n";
            break;
        case 6:
            cout<<"请输入所要删除书籍的位置:";
            cin>>a;
            if(ListDelete_L(L,a))
            cout<<"删除成功!\n\n";
            else cout<<"删除失败";
        case 7:
            cout<<"当前图书系统信息(链表)读出:\n";
            p=L->next;
            while(p){
               cout<<left<<setw(15)<<p->data.id<<"\t"
               <<left<<setw(50)<<p->data.name<<"\t"
               <<left<<setw(5)<<p->data.price<<endl;
               p=p->next;
            }
            cout<<endl;
            break;

        }
    }
    return 0;
}

 

链表的结构为 一个结点指向下一个结点的地址,末尾结点为空。

附带book.txt 信息

ISBN         书名                定价
9787302257646  程序设计基础   25
9787302219972  单片机技术及应用  32
9787302203513  编译原理   46
9787811234923  汇编语言程序设计教程  21
9787512100831  计算机操作系统   17
9787302265436  计算机导论实验指导  18
9787302180630  实用数据结构   29
9787302225065  数据结构(C语言版)  38
9787302171676  C#面向对象程序设计  39
9787302250692  C语言程序设计   42
9787302150664  数据库原理   35
9787302260806  Java编程与实践   56
9787302252887  Java程序设计与应用教程  39
9787302198505  嵌入式操作系统及编程  25
9787302169666  软件测试   24
9787811231557  Eclipse基础与应用  35

 

posted on 2017-03-18 23:15  VbisoWen  阅读(349)  评论(0编辑  收藏  举报

导航