数据结构之线性表(顺序表,单链表)——图书管理系统

顺序表:

代码如下:

  1 #include<iostream>
  2 #include<fstream>
  3 #include<string>
  4 #include<iomanip>
  5 using namespace std;
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9 typedef int Status;
 10 typedef int ElemType;
 11
 12 #define MAXSIZE 100
 13 struct Book
 14 {
 15     string id;
 16     string name;
 17     double price;
 18 };
 19 typedef struct
 20 {
 21     Book *elem;
 22     int length;
 23 }SqList;
 24
 25 Status InitList_Sq(SqList &L)
 26 {
 27
 28     L.elem=new Book[MAXSIZE];
 29     if (!L.elem)
 30         exit(OVERFLOW);
 31     L.length = 0;
 32     return OK;
 33 }
 34
 35 Status GetElem(SqList L, int i, Book &e)
 36 {
 37     if (i < 1 || i > L.length)
 38         return ERROR;
 39     e=L.elem[i-1];                                                            //??请同学在此填写代码 //elem[i-1]单元存储第i个数据元素
 40     return OK;
 41 }
 42
 43 int LocateElem_Sq(SqList L, double e)
 44 {
 45     for (int i = 0; i < L.length; i++)
 46         if (L.elem[i].price == e)
 47             return i + 1;
 48     return 0;
 49 }
 50
 51 Status ListInsert_Sq(SqList &L, int i, Book e)
 52 {
 53     if ((i < 1) || (i > L.length + 1))
 54         return ERROR;
 55     if (L.length == MAXSIZE)
 56         return ERROR;
 57        for(int j=L.length-1;j>=i-1;j--)
 58          L.elem[j+1]=L.elem[j];
 59         L.elem[i-1]=e;                                                         //??请同学在此填写几行代码
 60     ++L.length;
 61     return OK;
 62 }
 63
 64 Status ListDelete_Sq(SqList &L, int i)
 65 {
 66     if ((i < 1) || (i > L.length))
 67         return ERROR;
 68     for (int j = i; j <= L.length; j++)
 69         L.elem[j - 1] = L.elem[j];
 70     --L.length;
 71     return OK;
 72 }
 73
 74 int main() {
 75     SqList L;
 76     int i = 0, temp, a, c, choose;
 77     double price;
 78     Book e;
 79     string head_1, head_2, head_3;
 80     cout << "1. 建立\n";
 81     cout << "2. 输入\n";
 82     cout << "3. 取值\n";
 83     cout << "4. 查找\n";
 84     cout << "5. 插入\n";
 85     cout << "6. 删除\n";
 86     cout << "7. 输出\n";
 87     cout << "0. 退出\n\n";
 88
 89     choose = -1;
 90     while (choose != 0) {
 91         cout << "请选择:";
 92         cin >> choose;
 93         switch (choose)
 94                 {
 95         case 1:
 96             if (InitList_Sq(L))
 97                 cout << "成功建立顺序表\n\n";
 98             else
 99                 cout << "顺序表建立失败\n\n";
100             break;
101         case 2: {
102             i = 0;
103             L.elem = new Book[MAXSIZE];
104             if (!L.elem)
105                 exit(OVERFLOW);
106             L.length = 0;
107             fstream file;
108             file.open("book.txt");
109             if (!file) {
110                 cout << "错误!未找到文件!" << endl;
111                 exit(ERROR);
112             }
113             file >> head_1 >> head_2 >> head_3;
114             while (!file.eof()) {
115                 file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
116                 i++;
117             }
118             cout << "输入 book.txt 信息完毕\n\n";
119             L.length = i;
120             file.close();
121         }
122             break;
123         case 3:
124             cout << "请输入一个位置用来取值:\n";
125             cin >> i;
126             temp = GetElem(L, i, e);
127             if (temp != 0) {
128                 cout << "查找成功\n";
129                 cout << "第" << i << "本图书的信息是:\n";
130                 cout << left << setw(15) << e.id << "\t" << left << setw(50)
131                         << e.name << "\t" << left << setw(5) << e.price << endl
132                         << endl;
133             } else
134                 cout << "查找失败!位置超出范围\n\n";
135             break;
136         case 4:
137             cout << "请输入所要查找价格:";
138             cin >> price;
139             temp = LocateElem_Sq(L, price);
140             if (temp != 0) {
141                 cout << "查找成功\n";
142                 cout << "该价格对应的书名为:" << L.elem[temp - 1].name << endl << endl;
143             } else
144                 cout << "查找失败!没有这个价格对应的书籍\n\n";
145             break;
146         case 5:
147             cout << "请输入插入的位置和书本信息,包括:编号 书名 价格(用空格隔开):";
148             cin >> a;
149             cin >> e.id >> e.name >> e.price;
150             if (ListInsert_Sq(L, a, e))
151                 cout << "插入成功.\n\n";
152             else
153                 cout << "插入失败.\n\n";
154             break;
155         case 6:
156             cout << "请输入所要删除的书籍的位置:";
157             cin >> c;
158             if (ListDelete_Sq(L, c))
159                 cout << "删除成功.\n\n";
160             else
161                 cout << "删除失败.\n\n";
162             break;
163         case 7:
164             cout << "当前图书系统信息(顺序表)读出:\n";
165             for (i = 0; i < L.length; i++)
166                 cout << left << setw(15) << L.elem[i].id << "\t" << left
167                         << setw(50) << L.elem[i].name << "\t" << left
168                         << setw(5) << L.elem[i].price << endl;
169             cout << endl;
170             break;
171         }
172     }
173     return 0;
174 }

测试结果:

单链表:

代码如下:

  1 #include<iostream>
  2 #include<string>
  3 #include<iomanip>
  4 #include<fstream>
  5 using namespace std;
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9 typedef int Status;
 10
 11 struct Book
 12 {
 13     string id;
 14     string name;
 15     double price;
 16 };
 17 typedef Book ElemType;
 18 typedef struct LNode
 19 {
 20     ElemType data;
 21     struct LNode *next;
 22 } LNode, *LinkList;
 23
 24 Status InitList_L(LinkList &L)
 25 {
 26     L=new LNode;
 27     L->next=NULL;
 28     return OK;
 29 }
 30
 31 Status GetElem_L(LinkList L, int i, Book &e)
 32 {
 33     int j;
 34     LinkList p;
 35     p=L->next;
 36     j=1;
 37     while (j<i && p)
 38      {
 39         p=p->next;
 40         ++j;
 41      }
 42     if(!p|| j>i)
 43         return ERROR;
 44     e=p->data;
 45     return OK;
 46 }
 47
 48 LNode *LocateElem_L(LinkList L, int e)
 49    {
 50     LinkList p;
 51     p = L->next;
 52     while(p&&p->data.price!=e)
 53         p=p->next;
 54     return p;
 55    }
 56
 57 Status ListInsert_L(LinkList &L, int i, Book &e) {
 58     int j;
 59     LinkList p, s;
 60     p = L;
 61     j = 0;
 62     while(p&&(j<i-1))
 63       {
 64           p=p->next;
 65           ++j;
 66       }
 67     if (!p||(j>i-1))
 68           return ERROR;
 69       s = new LNode;
 70       s->data=e;
 71       s->next=p->next;
 72       p->next=s;
 73     return OK;
 74 }
 75
 76 Status ListDelete_L(LinkList &L, int i)
 77 {
 78       LinkList p, q;
 79       int j;
 80       p = L;
 81       j = 0;
 82     while((p->next)&&(j < i - 1))
 83     {
 84       p=p->next;
 85       ++j;
 86     }
 87     if (!(p->next)||(j>i-1))
 88       return ERROR;
 89       q=p->next;
 90       p->next=q->next;
 91       delete q;
 92     return OK;
 93 }
 94
 95
 96
 97 int main() {
 98     int a,n,choose;
 99     double price;
100     Book e;
101     LinkList L,p;
102     string head_1, head_2, head_3;
103     cout<<"1. 建立\n";
104     cout<<"2. 输入\n";
105     cout<<"3. 取值\n";
106     cout<<"4. 查找\n";
107     cout<<"5. 插入\n";
108     cout<<"6. 删除\n";
109     cout<<"7. 输出\n";
110     cout<<"0. 退出\n\n";
111
112     choose = -1;
113     while (choose != 0)
114     {
115         cout<<"请选择:";
116         cin >>choose;
117         switch (choose)
118         {
119         case 1:
120             if (InitList_L(L))
121                 cout<<"成功建立链表!\n\n";
122             break;
123         case 2:
124      {
125         L = new LNode;
126         L->next = NULL;
127         int length = 0;
128         fstream file;
129         file.open("book.txt");
130         if (!file)
131         {
132             cout << "未找到相关文件,无法打开!" << endl;
133                 exit(ERROR);
134         }
135         file >> head_1 >> head_2 >> head_3;
136         while (!file.eof())
137         {
138             p = new LNode;
139             file >> p->data.id >> p->data.name >> p->data.price;
140             p->next = L->next;
141             L->next = p;
142             length++;
143         }
144         file.close();
145     }
146             break;
147         case 3:
148             cout<<"请输入一个位置用来查找:";
149             cin >>a;
150             if(GetElem_L(L,a,e))
151                 {
152                 cout<<"查找成功\n";
153                 cout<<"第"<<a<<"本图书的信息是:\n";
154                 cout<<left << setw (15) <<e.id<<"\t"<<left<<setw (50)
155                         <<e.name<<"\t"<<left<<setw (5)<<e.price<<endl
156                         <<endl;
157                 }
158             else
159                 cout<<"查找失败\n\n";
160               break;
161         case 4:
162             cout<<"请输入所要查找的价格:";
163             cin >> price;
164             if (LocateElem_L(L, price)!=NULL)
165                 {
166                 cout<<"查找成功\n";
167                 cout<<"该价格对应的书名:"<<LocateElem_L(L, price)->data.name
168                         << endl << endl;
169                 }
170             else
171                 cout<<"查找失败!定价"<<price<<" 没有找到\n\n";
172             break;
173         case 5:
174             cout<<"请输入插入的位置和书的信息,包括:编号 书名 价格(用空格隔开):";
175             cin >>a;
176             cin >>e.id>>e.name>>e.price;
177             if (ListInsert_L(L,a,e))
178                 cout<<"插入成功.\n\n";
179             else
180                 cout<<"插入失败!\n\n";
181             break;
182         case 6:
183             cout<<"请输入所要删除的书籍位置:";
184             cin >>a;
185             if (ListDelete_L(L, a))
186                 cout<<"删除成功!\n\n";
187             else
188                 cout<<"删除失败!\n\n";
189             break;
190         case 7:
191             cout << "当前图书系统信息(链表)读出:\n";
192             p=L->next;
193             while(p)
194             {
195             cout<<left<<setw(15)<<p->data.id<<"\t"<<left<<setw(
196                         50)<<p->data.name<<"\t"<<left<<setw(5)
197                         <<p->data.price<<endl;
198                    p=p->next;
199             }
200             cout<<endl;
201             break;
202         }
203     }
204         return 0;
205 }

测试结果:

当然啦,只有这些代码是不能运行的,得把book.txt文件与这个代码所存储的文件放到一个文件夹,然后运行

代码就OK啦!

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

把上面的那个类似表格的东西复制到记事本里,然后把记事本重命名为book.txt就ok啦

原文地址:https://www.cnblogs.com/Trojan00/p/8859038.html

时间: 2024-10-14 08:23:20

数据结构之线性表(顺序表,单链表)——图书管理系统的相关文章

小猪的数据结构辅助教程——2.2 线性表中的单链表

小猪的数据结构辅助教程--2.2 线性表中的单链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.理解顺序表以及单链表各自的有点以及缺点! 2.熟悉单链表的形式,对于头指针,头结点,尾结点,数据域和指针域这些名词要知道是什么! 3.熟悉单链表的结点结构 4.区分头指针与头结点! 5.熟悉创建单链表的两种方式:头插法和尾插法 6.了解单链表12个基本操作的逻辑 7.有趣的算法题:查找单链表的中间结点~ 1.单链表的引入(顺序表与单链表的PK) 2.单链表的结构图以及一些名

线性表——顺序表与单链表学习小结

线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

线性表&gt;&gt;顺序表---&gt;逆置所有元素

1 /*顺序表中所有的元素逆置 2 * 3 */ 4 #include <iostream.h> 5 using namespace std; 6 7 int main(){ 8 void reverse_arr(int arr[],int n); 9 int a[]={0,1,2,3,4,5,6,7}; 10 int n=7; 11 reverse_arr(a,n); 12 for(int i=0;i<=n;i++){ 13 cout << a[i] << &q

数据结构和算法-数据结构-线性结构-顺序表 链表和哈希表

####################################################### """ # 线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础. # 根据线性表的实际存储方式,分为两种实现模型: # 顺序表, # 链表, # 下面分别进行研究, """ ####################################################### &qu

线性表-顺序表、链表类模板的实现(数据结构基础 第2周)

学习完课程后,自己用C++实现了简单的顺序表和链表,并用约瑟夫问题做了测试,不保证完全正确. 其中有一点需要注意一下:C++中类模板声明头文件和实现头文件不可以分离到.h和.cpp中,否则无法正常编译,详见:https://www.zhihu.com/question/20630104 源码 1.顺序表 //seqlist.h #pragma once #include <iostream> using namespace std; template <class T> class

数据结构-线性表-顺序表

总括: 线性表是一种最简单的数据结构,线性表的主要操作特点是可以在任意位置插入和删除一个数据元素. 线性表可以用顺序存储结构和链式存储结构存储,用顺序存储结构实现的线性表称为顺序表,用链式存储结构实现线性表称为链表. 1,线性表概述: 线性表:线性表是一种可以在任意位置进行插入和删除数据元素操作的,有n个(n>=0)个相同类型数据元素a0,a1,. . .an组成的线性结构. 线性表抽象数据类型:抽象数据类型是指一个逻辑概念上的类型和这个类型上的操作集合:因此,线性表的抽象数据类型主要包括两个方