




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》課程題目通訊錄課程編號(hào)學(xué)生姓名所在專業(yè)信息管理與信息系統(tǒng)
-1-目錄問(wèn)題描述·····························1問(wèn)題分析································1邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)··················1算法設(shè)計(jì)································2時(shí)間復(fù)雜度和空間復(fù)雜度分析··············4源代碼··································5程序運(yùn)行結(jié)果····························23心得····································28參考文獻(xiàn)·····································29
問(wèn)題描述李剛是一愛折騰的人,當(dāng)然愛折騰的人均有夢(mèng)想,他想當(dāng)中國(guó)的蓋次呢??刹唬F(xiàn)在個(gè)人好友信息多了,復(fù)雜了,他想制作一個(gè)個(gè)人通訊錄的制作管理軟件。剛好這個(gè)學(xué)期學(xué)了數(shù)據(jù)結(jié)構(gòu)課,所以他準(zhǔn)備使用數(shù)據(jù)結(jié)構(gòu)知識(shí)來(lái)實(shí)現(xiàn)了。并考慮使用雙向鏈表作數(shù)據(jù)結(jié)構(gòu)。并制定了初步要求:每個(gè)好友信息包含姓名、性別、住址、郵編、幾歲、電話、QQ、微信帳號(hào)、生日等。(2)作為一個(gè)完整的系統(tǒng),應(yīng)具有友好的界面和較強(qiáng)的容錯(cuò)能力。問(wèn)題分析完成通訊錄的一般性管理工作:記錄的增加、修改、刪除和輸出等功能。每個(gè)記錄里面包含姓名、性別、住址、郵編、幾歲、電話、QQ、微信帳號(hào)和生日的個(gè)人信息。在查找時(shí),以記錄的“姓名”或者以“學(xué)號(hào)”為關(guān)鍵字進(jìn)行查找,刪除時(shí)也以記錄的“學(xué)號(hào)”和“姓名”進(jìn)行刪除。邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)鏈表如何表示線性表中元素之間的邏輯關(guān)系;單鏈表、雙鏈表、循環(huán)鏈表鏈接方式上的區(qū)別;單鏈表上實(shí)現(xiàn)的建表、查找、插入和刪除等基本算法及其時(shí)間復(fù)雜度。循環(huán)鏈表上尾指針取代頭指針的作用,以及單循環(huán)鏈表上的算法與單鏈表上相應(yīng)算法的異同點(diǎn)。雙鏈表的定義和相關(guān)算法搜索。線性表的邏輯結(jié)構(gòu)特征就好象是一條線,上面打了一個(gè)個(gè)結(jié),很形象的,如果這條線上面有結(jié),那么它就是非空表,只能有一個(gè)開始結(jié)點(diǎn),有且只能有一個(gè)終端結(jié)點(diǎn),其它的結(jié)前后所相鄰的也只能是一個(gè)結(jié)點(diǎn)(直接前趨和直接后繼)。關(guān)于線性表上定義的基本運(yùn)算,主要有構(gòu)造空表、求表長(zhǎng)、取結(jié)點(diǎn)、查找、插入、刪除等。線性表的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)之間的關(guān)系。在計(jì)算機(jī)中,如何把線性表的結(jié)點(diǎn)存放到存儲(chǔ)單元中,就有許多方法,最簡(jiǎn)單的方法就是按順序存儲(chǔ)。就是按線性表的邏輯結(jié)構(gòu)次序依次存放在一組地址連續(xù)的存儲(chǔ)單元中。在存儲(chǔ)單元中的各元素的物理位置和邏輯結(jié)構(gòu)中各結(jié)點(diǎn)相鄰關(guān)系是一致的。在順序表中實(shí)現(xiàn)的基本運(yùn)算主要討論了插入和刪除兩種運(yùn)算。相關(guān)的算法我們通過(guò)練習(xí)掌握。對(duì)于順序表的插入和刪除運(yùn)算,其平均時(shí)間復(fù)雜度均為O(n)。線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。它與順序表不同,鏈表是用一組任意的存儲(chǔ)單元來(lái)存放線性表的結(jié)點(diǎn),這組存儲(chǔ)單元可以分布在內(nèi)存中任何位置上。因此,鏈表中結(jié)點(diǎn)的邏輯次序和物理次序不一定相同。所以為了能正確表示結(jié)點(diǎn)間的邏輯關(guān)系,在存儲(chǔ)每個(gè)結(jié)點(diǎn)值的同時(shí),還存儲(chǔ)了其后繼結(jié)點(diǎn)的地址信息(即指針或鏈)。這兩部分信息組成鏈表中的結(jié)點(diǎn)結(jié)構(gòu)。雙鏈表就是雙向鏈表,就是在單鏈表的每個(gè)結(jié)點(diǎn)里再增加一個(gè)指向其直接前趨的指針域prior,這樣形成的鏈表就有兩條不同方向的鏈。使得從已知結(jié)點(diǎn)查找其直接前趨結(jié)點(diǎn)可以和查找其直接后繼結(jié)點(diǎn)的時(shí)間一樣縮短為O(1)。雙鏈表一般也由頭指針head惟一確定。雙鏈表也可以頭尾相鏈接構(gòu)成雙(向)循環(huán)鏈表。算法設(shè)計(jì)使用雙向鏈表設(shè)計(jì)這通訊錄,設(shè)計(jì)內(nèi)容如下:classnode //節(jié)點(diǎn){ friendclasslink;//友遠(yuǎn)類private: dataperson;//數(shù)據(jù) node*next; node*pre;public: voidshow() //顯示數(shù)據(jù)信息 { cout<<"姓名:"<<setw(20)<<<<endl; cout<<"性別:"<<setw(20)<<person.sex<<endl; cout<<"住址:"<<setw(20)<<person.adder<<endl; cout<<"郵編:"<<setw(20)<<person.post<<endl; cout<<"年齡:"<<setw(20)<<person.age<<endl; cout<<"電話:"<<setw(20)<<person.tel<<endl; cout<<"QQ號(hào)碼:"<<setw(20)<<person.qq<<endl; cout<<"微信賬號(hào):"<<setw(20)<<person.weixin<<endl; cout<<"生日:"<<setw(20)<<person.birth<<endl; } node(char*name0="",char*sex0="",char*adder0="",char*birth0="",char*weixin0="",char*tel0="",intage0=0,intpost0=0,intqq0=0) //構(gòu)造函數(shù) { strcpy(,name0); strcpy(person.sex,sex0); strcpy(person.adder,adder0); strcpy(person.birth,birth0); strcpy(person.weixin,weixin0); strcpy(person.tel,tel0); person.age=age0; person.qq=qq0; person.post=post0; next=NULL; pre=NULL; } node(node&n) ////拷貝構(gòu)造 { strcpy(,); strcpy(person.sex,n.person.sex); strcpy(person.adder,n.person.adder); strcpy(person.weixin,n.person.weixin); strcpy(person.tel,n.person.tel); strcpy(person.birth,n.person.birth); person.age=n.person.age; person.post=n.person.post; person.qq=n.person.qq; }};classlink{ //雙向鏈表 node*head; //頭指針 node*rear; //尾指針 node*findbyname(char*name0,node*temp) //查找姓名返回地址 { temp=head; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; returnNULL; } node*p=head; while(p){ if(strcmp(p->,name0)==0) //已找到 returnp; p=p->next; } while(temp){ if(Cmpstr(temp->,name0)) { cout<<endl<<"符合條件的記錄,如下:"<<endl; temp->show(); } temp=temp->next; } //if(temp) // cout<<"查無(wú)此人"<<endl<<endl;//未找到} returntemp; } node*findbyname(char*name0) //查找姓名返回地址 { if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; returnNULL; } node*p=head; while(p){ if(strcmp(p->,name0)==0) //已找到 returnp; p=p->next; } if(!p) cout<<"查無(wú)此人"<<endl<<endl; returnNULL;//未找到 }時(shí)間復(fù)雜度和空間復(fù)雜度分析雙鏈表僅僅是在單鏈表的結(jié)點(diǎn)中增加了一個(gè)指向其前驅(qū)的prior指針,因此,在雙鏈表中執(zhí)行按值查找和按位查找的操作和單鏈表相同。但雙鏈表在插入和刪除操作的實(shí)現(xiàn)上,和單鏈表有著較大的不同。這是因?yàn)椤版湣弊兓瘯r(shí)也需要對(duì)prior指針做出修改,其關(guān)鍵在于保證在修改的過(guò)程中不斷鏈。此外,雙鏈表可以很方便地找到其前驅(qū)結(jié)點(diǎn),因此,插入、刪除結(jié)點(diǎn)算法的時(shí)間復(fù)雜度僅為O(1)。intlength() //返回鏈表長(zhǎng)度 { if(!head) return0; node*p; intn=1; p=head; if(p->next) { p=p->next; n++; } returnn; }這個(gè)“返回鏈表長(zhǎng)度”的時(shí)間復(fù)雜度也為O(1)??臻g復(fù)雜度(SpaceComplexity)是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度。一個(gè)算法在計(jì)算機(jī)存儲(chǔ)器上所占用的存儲(chǔ)空間,包括存儲(chǔ)算法本身所占用的存儲(chǔ)空間,算法的輸入輸出數(shù)據(jù)所占用的存儲(chǔ)空間和算法在運(yùn)行過(guò)程中臨時(shí)占用的存儲(chǔ)空間這三個(gè)方面。算法的輸入輸出數(shù)據(jù)所占用的存儲(chǔ)空間是由要解決的問(wèn)題決定的,是通過(guò)參數(shù)表由調(diào)用函數(shù)傳遞而來(lái)的,它不隨本算法的不同而改變。存儲(chǔ)算法本身所占用的存儲(chǔ)空間與算法書寫的長(zhǎng)短成正比,要壓縮這方面的存儲(chǔ)空間,就必須編寫出較短的算法。算法在運(yùn)行過(guò)程中臨時(shí)占用的存儲(chǔ)空間隨算法的不同而異,有的算法只需要占用少量的臨時(shí)工作單元,而且不隨問(wèn)題規(guī)模的大小而改變,我們稱這種算法是“就地\"進(jìn)行的,是節(jié)省存儲(chǔ)的算法,如這一節(jié)介紹過(guò)的幾個(gè)算法都是如此;有的算法需要占用的臨時(shí)工作單元數(shù)與解決問(wèn)題的規(guī)模n有關(guān),它隨著n的增大而增大,當(dāng)n較大時(shí),將占用較多的存儲(chǔ)單元。如當(dāng)一個(gè)算法的空間復(fù)雜度為一個(gè)常量,即不隨被處理數(shù)據(jù)量n的大小而改變時(shí),可表示為O(1);當(dāng)一個(gè)算法的空間復(fù)雜度與以2為底的n的對(duì)數(shù)成正比時(shí),可表示為0(10g2n);當(dāng)一個(gè)算法的空I司復(fù)雜度與n成線性比例關(guān)系時(shí),可表示為0(n).若形參為數(shù)組,則只需要為它分配一個(gè)存儲(chǔ)由實(shí)參傳送來(lái)的一個(gè)地址指針的空間,即一個(gè)機(jī)器字長(zhǎng)空間;若形參為引用方式,則也只需要為其分配存儲(chǔ)一個(gè)地址的空間,用它來(lái)存儲(chǔ)對(duì)應(yīng)實(shí)參變量的地址,以便由系統(tǒng)自動(dòng)引用實(shí)參變量。因此,根據(jù)雙向鏈表的操作,可以發(fā)現(xiàn)其空間復(fù)雜度為O(n)。源代碼//node.h#include<iostream.h>#include<fstream.h>#include<string.h>#include<stdlib.h>#include<iomanip.h>structdata //數(shù)據(jù){ charname[20];//姓名 charsex[2]; charadder[30]; intpost; intqq; charweixin[20]; charbirth[10]; chartel[20];//電話 intage;//年齡};classnode //節(jié)點(diǎn){ friendclasslink;//友遠(yuǎn)類private: dataperson;//數(shù)據(jù) node*next; node*pre;public: voidshow() //顯示數(shù)據(jù)信息 { cout<<"姓名:"<<setw(20)<<<<endl; cout<<"性別:"<<setw(20)<<person.sex<<endl; cout<<"住址:"<<setw(20)<<person.adder<<endl; cout<<"郵編:"<<setw(20)<<person.post<<endl; cout<<"年齡:"<<setw(20)<<person.age<<endl; cout<<"電話:"<<setw(20)<<person.tel<<endl; cout<<"QQ號(hào)碼:"<<setw(20)<<person.qq<<endl; cout<<"微信賬號(hào):"<<setw(20)<<person.weixin<<endl; cout<<"生日:"<<setw(20)<<person.birth<<endl; } node(char*name0="",char*sex0="",char*adder0="",char*birth0="",char*weixin0="",char*tel0="",intage0=0,intpost0=0,intqq0=0) //構(gòu)造函數(shù) { strcpy(,name0); strcpy(person.sex,sex0); strcpy(person.adder,adder0); strcpy(person.birth,birth0); strcpy(person.weixin,weixin0); strcpy(person.tel,tel0); person.age=age0; person.qq=qq0; person.post=post0; next=NULL; pre=NULL; } node(node&n) ////拷貝構(gòu)造 { strcpy(,); strcpy(person.sex,n.person.sex); strcpy(person.adder,n.person.adder); strcpy(person.weixin,n.person.weixin); strcpy(person.tel,n.person.tel); strcpy(person.birth,n.person.birth); person.age=n.person.age; person.post=n.person.post; person.qq=n.person.qq; }};classlink{ //雙向鏈表 node*head; //頭指針 node*rear; //尾指針 node*findbyname(char*name0,node*temp) //查找姓名返回地址 { temp=head; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; returnNULL; } node*p=head; while(p){ if(strcmp(p->,name0)==0) //已找到 returnp; p=p->next; } while(temp){ if(Cmpstr(temp->,name0)) { cout<<endl<<"符合條件的記錄,如下:"<<endl; temp->show(); } temp=temp->next; } //if(temp) // cout<<"查無(wú)此人"<<endl<<endl;//未找到} returntemp; } node*findbyname(char*name0) //查找姓名返回地址 { if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; returnNULL; } node*p=head; while(p){ if(strcmp(p->,name0)==0) //已找到 returnp; p=p->next; } if(!p) cout<<"查無(wú)此人"<<endl<<endl; returnNULL;//未找到 } intlength() //返回鏈表長(zhǎng)度 { if(!head) return0; node*p; intn=1; p=head; if(p->next) { p=p->next; n++; } returnn; } node*findbynum(intnum) //根據(jù)序號(hào)查找 { intl=length(); //l為總長(zhǎng) if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; returnNULL; } if(num>l) //數(shù)據(jù)越界 { cout<<"通訊錄里沒(méi)有"<<num<<"條信息"<<endl<<endl; returnNULL; } node*p=head; while(--num) p=p->next; returnp; //返回指針 } voidchange(node*p)//修改對(duì)應(yīng)指針信息 { chartel0[20]; charsex0[2]; charadder0[30]; intpost0; intqq0; charweixin0[20]; charbirth0[10]; intage0,cho; cout<<"請(qǐng)輸入新的電話號(hào)碼:"<<endl; cin>>tel0; cout<<"請(qǐng)輸入新的性別:"<<endl; cin>>sex0; cout<<"請(qǐng)輸入新的住址:"<<endl; cin>>adder0; cout<<"請(qǐng)輸入新的郵編:"<<endl; cin>>post0; cout<<"請(qǐng)輸入新的電話號(hào)碼:"<<endl; cin>>tel0; cout<<"請(qǐng)輸入新的年齡:"<<endl; cin>>age0; cout<<"請(qǐng)輸入新的QQ號(hào)碼:"<<endl; cin>>qq0; cout<<"請(qǐng)輸入新的微信賬號(hào):"<<endl; cin>>weixin0; cout<<"請(qǐng)輸入新的生日:"<<endl; cin>>birth0; cout<<"姓名:"<<p-><<endl; cout<<"原性別:"<<setw(5)<<p->person.sex<<endl; cout<<"原住址:"<<setw(5)<<p->person.adder<<endl; cout<<"原郵編:"<<setw(5)<<p->person.adder<<endl; cout<<"原年齡:"<<setw(5)<<p->person.adder<<endl; cout<<"原電話號(hào)碼:"<<setw(20)<<p->person.tel<<endl; cout<<"原QQ號(hào)碼:"<<setw(5)<<p->person.adder<<endl; cout<<"原微信賬號(hào):"<<setw(5)<<p->person.adder<<endl; cout<<"原生日:"<<setw(5)<<p->person.adder<<endl; cout<<"新性別:"<<setw(20)<<sex0<<endl; cout<<"新電住址:"<<setw(20)<<adder0<<endl; cout<<"新郵編:"<<setw(20)<<post0<<endl; cout<<"新年齡:"<<setw(20)<<age0<<endl; cout<<"新電話號(hào)碼:"<<setw(20)<<tel0<<endl; cout<<"新QQ號(hào)碼:"<<setw(20)<<qq0<<endl; cout<<"新微信賬號(hào):"<<setw(20)<<weixin0<<endl; cout<<"新生日:"<<setw(20)<<birth0<<endl; cout<<"新年齡:"<<setw(3)<<age0<<endl<<endl; cout<<"1.確認(rèn) 2.取消"<<endl; cin>>cho; if(cho==1) { strcpy(p->person.tel,tel0); p->person.age=age0; cout<<"已修改成功"<<endl; } } voiddel(node*p) //刪除一個(gè)節(jié)點(diǎn) { if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; return; } if(p==head) //刪除頭結(jié)點(diǎn) { p->next->pre=NULL; head=p->next; deletep; return; } if(p==rear) //刪除尾節(jié)點(diǎn) { p->pre->next=NULL; rear=p->pre; deletep; return; } p->next->pre=p->pre; //刪除中間節(jié)點(diǎn) p->pre->next=p->next; deletep; } voiddelall() //刪除整個(gè)鏈表 { node*p; while(head) { p=head; head=head->next; deletep; } head=rear=NULL; }public: link() //構(gòu)造函數(shù) { head=rear=NULL; } ~link(){ //析構(gòu)函數(shù),同時(shí)釋放鏈表空間 delall(); } node*cinnode() //從鍵盤輸入生成一個(gè)節(jié)點(diǎn) { charname[20]; charsex[2]; charadder[30]; intpost; intqq; charweixin[20]; charbirth[10]; chartel[20];//電話 intage; node*p; p=newnode; cout<<"請(qǐng)輸入姓名:"<<endl; cin>>name; cout<<"請(qǐng)輸入性別:"<<endl; cin>>sex; cout<<"請(qǐng)輸入住址:"<<endl; cin>>adder; cout<<"請(qǐng)輸入郵編:"<<endl; cin>>post; cout<<"請(qǐng)輸入電話號(hào)碼:"<<endl; cin>>tel; cout<<"請(qǐng)輸入生日:"<<endl; cin>>birth; cout<<"請(qǐng)輸入qq號(hào)碼:"<<endl; cin>>qq; cout<<"請(qǐng)輸入微信賬號(hào):"<<endl; cin>>weixin; cout<<"請(qǐng)輸入年齡:"<<endl; cin>>age; *p=node(name,sex,adder,birth,weixin,tel,age,post,qq); returnp; } voidinsert(node*p) //將節(jié)點(diǎn)插入鏈表 { node*p1,*p2; if(head==0) //空鏈表 { p->next=0; p->pre=0; head=rear=p; return; } if(strcmp(head->,p->)>0) { p->next=head; head->pre=p; p->pre=0; head=p; return; } if(strcmp(rear->,p->)<0) { p->pre=rear; rear->next=p; p->next=0; rear=p; return; } p1=p2=head; while(strcmp(p2->,p->)<0) { p1=p2; p2=p2->next; } p->next=p2; //插入鏈表中間 p2->pre=p; p1->next=p; p->pre=p1; } voidshowfromhead() //從前向后輸出鏈表 { if(!head) //空鏈表 cout<<"通訊錄無(wú)信息"<<endl; else{ intc=0; node*p; p=head; while(p) { p->show(); //調(diào)用函數(shù)顯示信息 p=p->next; c++; //if(c%5==0) //控制每輸出5個(gè)暫停一次 //system("pause"); } cout<<"所有信息輸出完成"<<endl; } } voidshowfromrear() //從后向前輸出鏈表 { if(!rear) cout<<"通訊錄無(wú)信息"<<endl; else { intc=0; node*p; p=rear; while(p) { p->show(); p=p->pre; c++; if(c%6==0) system("pause"); } cout<<"所有信息輸出完成"<<endl; } } voidshowbyname(node*temp) //根據(jù)姓名顯示信息 { charname[20]; cout<<"請(qǐng)輸入欲查找的姓名"<<endl; cin>>name; node*p; p=findbyname(name,temp); //查找姓名所對(duì)應(yīng)的指針 if(p) p->show(); } voidchangebyname() //根據(jù)姓名修改信息 { charname[20]; cout<<"請(qǐng)輸入欲修改的姓名"<<endl; cin>>name; node*p; p=findbyname(name); if(p) change(p); } voiddelbyname() //根據(jù)姓名刪除信息 { charname[20]; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; return; } cout<<"請(qǐng)輸入欲刪除的姓名"<<endl; cin>>name; node*p; p=findbyname(name); if(p) del(p); cout<<"已刪除選定信息"<<endl; } voidshowbynum() //根據(jù)序號(hào)顯示信息 { intnum; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; return; } cout<<"請(qǐng)輸入欲查找編號(hào)"<<endl; cin>>num; node*p; p=findbynum(num); //根據(jù)序號(hào)查找指針 if(p) p->show(); } voiddelbynum() //根據(jù)序號(hào)刪除信息 { intnum; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; return; } cout<<"請(qǐng)輸入欲刪除編號(hào)"<<endl; cin>>num; node*p; p=findbynum(num); if(p) del(p); cout<<"已刪除選定信息"<<endl; } voidchangebynum() //根據(jù)序號(hào)修改信息 { intnum; if(!head) //空鏈表 { cout<<"通訊錄中沒(méi)有信息"<<endl<<endl; return; } cout<<"請(qǐng)輸入欲修改編號(hào)"<<endl; cin>>num; node*p; p=findbynum(num); if(p) change(p); } /* voidinputnode()//從文件讀入 { charfilename[30]; cout<<"輸入數(shù)據(jù)源文件名"<<endl; cin>>filename; ifstreamfin(filename,ios::in|ios::nocreate); if(!fin) { cout<<"無(wú)法打開指定文件"<<endl; exit(1); } charname[20],tel[20]; intage; node*p; while(fin>>name) { fin>>tel>>age; *p=node(name,sex,adder,post,birth,qq,weixin,tel,age); insert(p); } fin.close(); }*/ voidoutfromhead() //順序輸出至文件 { charfilename[30]; cout<<"輸入數(shù)據(jù)目標(biāo)文件名"<<endl; cin>>filename; ofstreamfout(filename); if(!fout) { cout<<"無(wú)法打開指定文件"<<endl; exit(1); } if(!head) fout<<"通訊錄無(wú)信息"<<endl; else{ node*p; p=head; while(p) { fout<<"姓名:"<<setw(20)<<p-><<endl; fout<<"性別:"<<setw(2)<<p->person.sex<<endl; fout<<"住址:"<<setw(20)<<p->person.adder<<endl<<endl; fout<<"郵編:"<<setw(10)<<p->person.post<<endl<<endl; fout<<"年齡:"<<setw(10)<<p->person.age<<endl<<endl; fout<<"電話:"<<setw(10)<<p->person.tel<<endl<<endl; fout<<"QQ號(hào)碼:"<<setw(10)<<p->person.qq<<endl<<endl; fout<<"微信賬號(hào):"<<setw(10)<<p->person.weixin<<endl<<endl; fout<<"生日:"<<setw(10)<<p->person.birth<<endl<<endl; p=p->next; } cout<<"所有信息輸出完成"<<endl; } } voidoutfromrear() //逆序輸出至文件 { charfilename[30]; cout<<"輸入數(shù)據(jù)目標(biāo)文件名"<<endl; cin>>filename; ofstreamfout(filename); if(!fout) { cout<<"無(wú)法打開指定文件"<<endl; exit(1); } if(!rear) fout<<"通訊錄無(wú)信息"<<endl; else { node*p; p=rear; while(p) { fout<<"姓名:"<<setw(20)<<p-><<endl; fout<<"性別:"<<setw(2)<<p->person.sex<<endl; fout<<"住址:"<<setw(20)<<p->person.adder<<endl<<endl; fout<<"郵編:"<<setw(10)<<p->person.post<<endl<<endl; fout<<"年齡:"<<setw(10)<<p->person.age<<endl<<endl; fout<<"電話:"<<setw(10)<<p->person.tel<<endl<<endl; fout<<"QQ號(hào)碼:"<<setw(10)<<p->person.qq<<endl<<endl; fout<<"微信賬號(hào):"<<setw(10)<<p->person.weixin<<endl<<endl; fout<<"生日:"<<setw(10)<<p->person.birth<<endl<<endl; p=p->pre; } cout<<"所有信息輸出完成"<<endl; } } boolCmpstr(char*name_node,char*name_search)//傳統(tǒng)型字符串比較函數(shù),支持通配符*,?及大小寫轉(zhuǎn)換,name_node等于name_search時(shí),返回true { if(name_search[0]=='*')//通配符*,通配任意字符串,返回true returntrue; charname1[20],name2[20];//避免改變?cè)Y(jié)點(diǎn)中的信息 strncpy(name1,name_node,20); strncpy(name2,name_search,20); intsize1=strlen(name1),size2=strlen(name_search); for(inti=0;i<size2;i++) { if(name2[i]>='A'&&name2[i]<='Z')//大寫全部轉(zhuǎn)換為小寫,以便于比較,人性化處理 name2[i]+=32; } for(inti1=0;i1<size1;i1++) { if(name1[i1]>='A'&&name1[i1]<='Z')//大寫全部轉(zhuǎn)換為小寫,以便于比較,人性化處理 name1[i1]+=32; } for(inti2=0;i2<size1;i2++) { if(name_search[i2]=='*')//通配符*,通配任意字符串, { for(intj=0;j<i2;j++) { if(name1[j]!=name2[j]) returnfalse; } returntrue; } } if(size1!=size2)//不等長(zhǎng)時(shí),即兩字符串不相等,返回false { returnfalse; } for(inti3=0;i3<size1;i3++) { if(name2[i3]=='?')//通配符‘?’,通配任一字符 continue; if(name1[i3]!=name2[i3]) returnfalse; } returntrue; }};//main.cpp//#include"node.h"voidmain();charbuffer[100];voidshow_data(link&a){ charc; cout<<"查看全部數(shù)據(jù)"<<endl; cout<<"1.順序2.逆序"<<endl; cin>>c; if(c=='1') { a.showfromhead(); system("pause"); cout<<endl<<endl; system("cls"); return; } if(c=='2') { a.showfromrear(); system("pause"); cout<<endl<<endl; system("cls"); return; } if(c!='1'&&c!='2') { cout<<"inputerror"<<endl; system("pause"); cout<<endl<<endl; system("cls"); voidshow_data(link&a); return; }};voiddelet_data(link&a){ charc; cout<<"刪除數(shù)據(jù)"<<endl; cout<<"1.根據(jù)序號(hào)刪除數(shù)據(jù) 2.根據(jù)姓名刪除數(shù)據(jù)"<<endl; cin>>c; if(c=='1') { a.delbynum(); system("pause"); cout<<endl<<endl; system("cls"); } if(c=='2') { a.delbyname(); system("pause"); cout<<endl<<endl; system("cls"); } if(c!='1'&&c!='2') { cout<<"inputerror"<<endl; system("pause"); cout<<endl<<endl; system("cls"); voiddelet_data(link&a); }};voidinsert_data(link&a){ cout<<"添加數(shù)據(jù)"<<endl; a.insert(a.cinnode()); system("pause"); cout<<endl<<endl; system("cls");};voidupdata(link&a){ charc; cout<<"修改數(shù)據(jù)"<<endl; cout<<"1.根據(jù)序號(hào)修改數(shù)據(jù) 2.根據(jù)姓名修改數(shù)據(jù)"<<endl; cin>>c; if(c=='1') { a.changebynum(); system("pause"); cout<<endl<<endl; system("cls"); } if(c=='2') { a.changebyname(); system("pause"); cout<<endl<<endl; system("cls"); } if(c!='1'&&c!='2') { cout<<"inputerror"<<endl; system("pause"); cout<<endl<<endl; system("cls"); voidupdata(link&a); }};voidsearch_data(link&a){ charc; node*temp; cout<<"查找數(shù)據(jù)"<<endl; cout<<"1.根據(jù)序號(hào)查找數(shù)據(jù) 2.根據(jù)姓名查找數(shù)據(jù)(支持*與?的通配)"<<endl; cin>>c; if(c=='1') { a.showbynum(); system("pause"); cout<<endl<<endl; system("cls"); } if(c=='2') { a.showbyname(temp); system("pause"); cout<<endl<<endl; system("cls"); } if(c!='1'&&c!='2') { cout<<"inputerror"<<endl; system("pause"); cout<<endl<<endl; system("cls"); voidsearch_data(link&a); }};voidoutput_data(link&a){ charc; cout<<"將數(shù)據(jù)輸出至文件"<<endl; cout<<"1.升序 2.降序"<<endl; cin>>c; if(c=='1') { a.outfromhead(); system("pause"); cout<<endl<<endl; system("cls"); } if(c=='2') { a.outfromrear(); system("pause"); cout<<endl<<endl; system("cls"); } if(c!='1'&&c!='2') { cout<<"inputerror"<<endl; system("pause"); cout<<endl<<endl; system("cls"); voidoutput_data(link&a); }};linka;voidmenu(){ charc; cout<<"\t******************歡迎使用******************\n"; cout<<"\t***************通訊錄管理系統(tǒng)***************\n"; cout<<"\t**\
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)離婚合同全文
- 新能源汽車銷售代理合同
- 商品房買賣合同示例
- 畢業(yè)生檔案托管合同協(xié)議書
- 廣告投放合同「樣本」
- 多人合伙經(jīng)營(yíng)合同范例大全
- 屋頂防水修繕項(xiàng)目合同
- 戶外廣告LED大屏租賃合同
- 稻谷購(gòu)銷合同樣本
- 腎性貧血的治療課件
- 《國(guó)際貿(mào)易實(shí)務(wù)(英文版)》(英文課件) -Ch 6 International Cargo Transport-Ch 11 Cross-border Commerce
- 新條令.新亮點(diǎn)-內(nèi)務(wù)條令解讀
- 中醫(yī)適宜技術(shù)-中藥熱奄包
- 林海雪原課件6張
- 銀發(fā)經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展規(guī)劃
- 肝硬化課件(共45張)
- 家長(zhǎng)會(huì)課件:小學(xué)語(yǔ)文二年級(jí)家長(zhǎng)會(huì)課件
- 2024年西安電力高等??茖W(xué)校單招職業(yè)技能測(cè)試題庫(kù)及答案解析
- 2024年中國(guó)科學(xué)技術(shù)大學(xué)創(chuàng)新班物理試題答案詳解
- 中職數(shù)學(xué)基礎(chǔ)模塊上冊(cè)學(xué)業(yè)水平考試第四章三角函數(shù)單元測(cè)試及參考答案
- 山東信息職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論