????????本次實驗是在DEV C++軟件上進(jìn)行實現(xiàn)的。語言采用的是c++語言,但在整體上與c語言大致相似(不管用什么語言實現(xiàn),思想是不變的)。
? ? ? ? 此次實現(xiàn)的整體思路:首先定義圖書這個抽象數(shù)據(jù)類型,并且定義節(jié)點(diǎn)抽象數(shù)據(jù)類型(根據(jù)這些抽象數(shù)據(jù)類型對下面的數(shù)據(jù)進(jìn)行定義)。然后進(jìn)行單鏈表的初始化、單鏈表的取值、單鏈表的查找、單鏈表的插入、單鏈表的刪除、尾插法建立單鏈表。在尾插法建立單鏈表時使用了文件流讀取txt文件,并將其存儲到鏈表中。最后建立主函數(shù),使用主函數(shù)調(diào)用上述的算法。
? ? ? ? 具體程序代碼如下:
#include<iostream>
#include<fstream>
#include <iomanip>
typedef int Status;
using namespace std;
struct Book {
string id;//ISBN
string name;//書名
double price;//價格
};
typedef struct LNode {
Book data;//節(jié)點(diǎn)數(shù)據(jù)
struct LNode *next;//節(jié)點(diǎn)指針域
} LNode, *LinkList;//都是LNode的別名,其中LinkList 為指向結(jié)構(gòu)體LNode的指針類型
//單鏈表的初始化
Status InitList (LinkList &L) {
//構(gòu)建一個空鏈表
L = new LNode;//生成新節(jié)點(diǎn)作為頭節(jié)點(diǎn),頭指針L指向頭結(jié)點(diǎn)
L->next = NULL;//頭指針指針域置空。
return 1; //初始化成功返回1.
}
// 單鏈表的取值
Status GetElem (LinkList L, int i, Book &e) {
//在帶頭節(jié)點(diǎn)的單鏈表L中查找第i個元素,并賦值給e
LNode *p;
int j;
p = L->next;//初始化,p指向首元節(jié)點(diǎn),計數(shù)器初值賦值為1.
j = 1;
while (p && j < i) {//順著鏈表往下找,直到p為空或者p指向第i個元素。
p = p->next;
++j;
}
if(!p || j > i) {
cout << "i值不合法。";
return 0;
}
e = p->data;//將*P節(jié)點(diǎn)的數(shù)據(jù)賦值給e。
return 1;//取值成功返回1.
}
//單鏈表的查找
Status LocateElem (LinkList L,double e) {
//在帶頭結(jié)點(diǎn)的單鏈表L中查找值為e的元素。
LNode *p;
int j = 1;
p = L->next;//初始化,指針p指向首元節(jié)點(diǎn)
while (p && p->data.price != e) {//順著鏈表向下查找,直到p為空,或者p所指的數(shù)據(jù)域等于e。
p = p->next;
++j;
}
return j;//查找成功返回e的節(jié)點(diǎn)地址p,失敗則返回NULL。
}
//單鏈表的插入
Status ListInsert (LinkList &L,int i, Book &e) {
LNode * p, * s;
int j = 0;
p = L;
while (p && j < i -1) {//查找第i-1個元素節(jié)點(diǎn),p指向該節(jié)點(diǎn)。
p = p->next;
++j;
}
if(!p || j > i - 1) {
cout << "i值不合法!??!";
return 0;
}
s = new LNode;//生成新節(jié)點(diǎn)*s。
s->data = e;//將新節(jié)點(diǎn)的數(shù)據(jù)域置為e。
s->next = p->next;//將節(jié)點(diǎn)*s的指針域指向第i個元素。
p->next = s;//將節(jié)點(diǎn)*p的指針域指向*s的指針域。
return 1;//插入成功返回1.
}
//單鏈表的刪除
Status ListDelete (LinkList &L, int i) {
LNode *p, *q;
p = L;
int j = 0;
while (p->next && j < i - 1) {//查找第i-1個節(jié)點(diǎn),p指向第i-1個位置。
p = p->next;
++j;
}
if(!(p->next) || j > i - 1) {
cout << "i值不合法,刪除失?。。。?;
}
q = p->next;//臨時保存被刪除節(jié)點(diǎn)的地址以備釋放。
p->next = q->next;//改變刪除節(jié)點(diǎn)前驅(qū)結(jié)點(diǎn)的指針域。
delete q;
return 1;//刪除成功返回1.
}
//使用尾插法創(chuàng)建單鏈表
void CreateList (LinkList &L, int n) {
LinkList p,r;
string head_1,head_2,head_3;
L = new LNode;
L->next = NULL;//先建立一個帶頭結(jié)點(diǎn)的空鏈表。
r = L;//尾指針r指向頭結(jié)點(diǎn)
int length = 0;
fstream file;
file.open("book.txt");
if(!file) {
cout << "未找到相關(guān)文件,無法打開?。。? <<endl;
exit(0);
}
file >> head_1 >> head_2 >> head_3;
while (!file.eof()) {//蔣文件中的信息運(yùn)用尾插法插入到鏈表中。
p = new LNode;//生成新節(jié)點(diǎn)。
file >> p->data.id >> p->data.name >> p->data.price;//輸入元素賦值給新節(jié)點(diǎn)的數(shù)據(jù)域。
p->next = NULL;
r->next = p;//新節(jié)點(diǎn)*p插入到尾結(jié)點(diǎn)*r之后。
r = p;//r指向新的尾結(jié)點(diǎn)*p
length++;//同時對鏈表的長度進(jìn)行統(tǒng)計
}
file.close();
}
//構(gòu)建主函數(shù),調(diào)用上述算法
int main() {
int i = 0, n = 0, choose,length = 0;
double price;
Book e;
LinkList L,p;
choose = -1;
cout << "1,建立\n";
cout << "2,輸入\n";
cout << "3,取值\n";
cout << "4,查找\n";
cout << "5,插入\n";
cout << "6,刪除\n";
cout << "7,輸出\n";
cout << "8,退出\n";
while (choose != 0) {
cout << "請選擇:\n";
cin >> choose;
switch (choose) {
case 1://建立單鏈表。
{
if(InitList(L)) {
cout << "成功建立鏈表!\n";
}
break;
}
case 2://使用尾插法創(chuàng)建單鏈表。
{
CreateList (L,length);
cout << "輸入book.txt 信息完畢\n";
}
break;
case 3://單鏈表的按序號取值,
//調(diào)用函數(shù):Status GetElem (LinkList L, int i, Book &e)
{
cout << "請輸入序號:\n";
cin >> i;
GetElem(L,i,e);//調(diào)用單鏈表的取值函數(shù)。
cout << "序號為" << i << "的圖書信息為:\n";
cout << e.id << "\t\t" << e.name << "\t\t"<<e.price;
}
break;
case 4://單鏈表的查找,調(diào)用函數(shù):
// Status LocateElem (LinkList L,double e)
{
price = 0;
cout << "請輸入查找的價格;";
cin >> price;
n = LocateElem(L,price);
cout << "第一個出現(xiàn)該價格的圖書序號為:";
cout << n;
}
break;
case 5://單鏈表的插入,調(diào)用函數(shù):
// Status ListInsert (LinkList &L,int i, Book &e)
{
cout << "請輸入插入的位置,和圖書信息(編號、書名、價格):";
cin >> i >> e.id >> e.name >> e.price;
if(ListInsert(L,i,e)) {
cout << "插入成功?。。?;
}
}
break;
case 6://單鏈表的刪除,調(diào)用函數(shù):
// Status ListDelete (LinkList &L, int i)
{
cout << "請輸入所要刪除圖書的序號:\n";
cin >> i;
if(ListDelete(L,i)) {
cout << "刪除成功?。。?;
}
}
break;
case 7://單鏈表的輸出
{
cout << "當(dāng)前圖書系統(tǒng)信息(鏈表)讀出:\n";
p = L->next;//節(jié)點(diǎn)*p指向鏈表的首元節(jié)點(diǎn)。
while (p) {
cout << left << setw(15) << p->data.id <<
left << setw(50)<<p->data.name <<left<<setw(5)
<<p->data.price<<endl;
p=p->next;
}
cout <<endl;
}
break;
case 8:
choose = 0;
break;
default:
break;
}
}
return 0;
}
程序中用到的book.txt文件:文章來源:http://www.zghlxwxcb.cn/news/detail-717275.html
鏈接:https://pan.baidu.com/s/1RZm-5azt7Qu4JMD2Ll_HFw?pwd=tfr2?文章來源地址http://www.zghlxwxcb.cn/news/detail-717275.html
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)之線性表】單鏈表實現(xiàn)圖書管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!