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