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

Posted 迷途纸鸢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之线性表(顺序表,单链表)——图书管理系统相关的知识,希望对你有一定的参考价值。

顺序表:

代码如下:

  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];                                                       
 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             }

以上是关于数据结构之线性表(顺序表,单链表)——图书管理系统的主要内容,如果未能解决你的问题,请参考以下文章

《数据结构》第二章 | 线性表 知识梳理(应对期末考)

线性表之单链表

数据结构学习总结 线性表之单链表

线性链表之顺序表

数据结构:线性表顺序表以及单链表详解

顺序表与单链表的区别及优缺点