# include & ltfstream & gt
# include & ltiostream & gt
# include & lt字符串& gt
使用命名空間std
Class student{ //為簡單起見,數據字段中只保存學生編號和姓名。
int鍵;
字符串名稱;
公共:
void putkey(int k){ key = k;}
void Putnam(string Nam){ name = Nam;}
void show(){ cout & lt;& ltkey & lt& lt\ t‘& lt;& lt名稱& lt& ltendl}//應重載典型的插入運算符。
布爾運算符& lt學生& ampstu){回車鍵& ltstu.key}
布爾運算符!=(學生& amp斯圖){回車鍵!= stu.key}
};
int main(){
int i,k;
字符串nam
節點& lt學生& gt* p 1;
學生斯圖;
列表& lt學生& gtlist1,list2,list3
ifstream infile
infile . open(“exp 19 _ 1 . txt“,IOs::in);
如果(!infile)
cout & lt& lt“無法打開文件“
返回1;
}
for(I = 0;我& lt9;i++){
infile>& gtk;
stu . putkey(k);
infile>& gtnam
斯圖·普特南(Nam);
P1=list1。CreatNode(斯圖);
列表1。insert front(p 1);//生成list1 forward。
P1=list1。CreatNode(斯圖);
列表2。insert rear(p 1);//反向生成list2。
}
infile . close();
列表1。print list();
cout & lt& lt“列表1長度:“
cout & lt& ltendl
列表2。print list();
cout & lt& ltendl
cout & lt& lt“請輸入要刪除的學生ID“
CIN & gt;& gtk;
stu . putkey(k);
P1=list1。找(斯圖);
if(p 1!=NULL)
P1=list1。delete node(p 1);
刪除p 1;
列表1。print list();
cout & lt& lt“列表1長度:“
}
else cout & lt& lt“找不到“
cout & lt& ltendl
列表1。make empty();//空列表1
cout & lt& lt“清空後列表1的長度:“
infile . open(“exp 19 _ 1 . txt“,IOs::in);
infile . clear();//如果文本文件在結尾前缺少回車符,沒有這句話會出錯。
如果(!infile)
cout & lt& lt“無法打開文件“
返回1;
}
for(I = 0;我& lt9;i++){
infile>& gtk;
stu . putkey(k);
infile>& gtnam
斯圖·普特南(Nam);
P1=list3。CreatNode(斯圖);
列表3。insert order(p 1);//按升序創建list1。
}
infile . close();
列表3。print list();
cout & lt& ltendl
返回0;
}
這是壹個頭文件:
# include & ltiostream & gt
使用命名空間std
//首先看節點組織,使用節點類,所有與節點數據和指針操作相關的函數都作為成員函數。
模板& lt鍵入名稱T & gt班級名單;
模板& lt鍵入名稱T & gt類別節點{
t信息;//數據字段
節點& ltT & gt*鏈接;//指針字段
公共:
node();//生成頭節點的構造函數。
節點(常數T & amp數據);//生成通用節點的構造函數
void insert after(Node & lt;T & gt* P);//在當前節點後插入壹個節點。
節點& ltT & gt* remove after();//刪除當前節點的後繼節點,並返回此節點以備後用。
好友類別列表& ltT & gt;
//使用列表作為友元類,列表可以直接訪問節點的私有成員,這與結構壹樣方便,但更安全。
};
模板& lt鍵入名稱T & gt節點& ltT & gt* Node(){ link = NULL;}
模板& lt鍵入名稱T & gt節點& ltT & gt*節點(const T & amp數據){
info = data
link = NULL
}
模板& lt鍵入名稱T & gt空節點& ltT & gt* insert after(Node & lt;T & gt* p ){
p-》;link =鏈接;
link = p;
}
模板& lt鍵入名稱T & gt節點& ltT & gt*節點& ltT & gt* remove after(){
節點& ltT & gt* tempP = link
if(link = = NULL)tempP = NULL;//在鏈的末端,它後面沒有節點。
else link = tempP-& gt;鏈接;
返回tempP
}
//重新定義鏈表類並選擇常用操作,包括建立有序鏈表、查找遍歷、插入、刪除和取出數據。
模板& lt鍵入名稱T & gt課程列表{
節點& ltT & gt*頭,*尾;//鏈表頭指針和尾指針
公共:
list();//生成頭節點的構造函數(空鏈表)
~ List();//析構函數
void make empty();//清空鏈表,只留下頭節點。
節點& ltT & gt*查找(測試數據);//搜索具有相同數據域的節點並返回該節點的地址。
int Length();//計算單鏈表的長度
void print list();//打印鏈表的數據字段。
void insert front(Node & lt;T & gt* p);//它可以用於向前生成壹個鏈表並在頭中插入壹個節點。
void insert rear(Node & lt;T & gt* p);//可以用來向後生成壹個鏈表,並在表的末尾添加壹個節點。
void InsertOrder(節點& ltT & gt* p);//按升序生成鏈表
節點& ltT & gt*CreatNode(測試數據);//創建節點(孤立節點)
節點& ltT & gt* delete Node(Node & ltT & gt* p);//刪除指定的節點
};
模板& lt鍵入名稱T & gt列表& ltT & gt* List(){
head = tail =新節點& ltT & gt();
}
模板& lt鍵入名稱T & gt列表& ltT & gt::~ List(){
make empty();
刪除標題;
}
模板& lt鍵入名稱T & gt無效列表& ltT & gt* make empty(){
節點& ltT & gt* tempP
while(head-》;鏈接!=NULL)
tempP = head-& gt;鏈接;
head-》;link=tempP->。鏈接;//從鏈中分離頭節點之後的第壹個節點。
刪除tempP//刪除(釋放)分離節點
}
尾巴=頭;//頭指針和尾指針都指向頭節點,表示鏈為空。
}
模板& lt鍵入名稱T & gt節點& ltT & gt*列表& ltT & gt*查找(測試數據){
節點& ltT & gt* tempP = head-& gt;鏈接;
而(tempP!= NULL & amp& amptempP-& gt;信息!= data)tempP = tempP-》;鏈接;
返回tempP//如果搜索成功則返回節點地址,如果搜索不成功則返回NULL。
}
模板& lt鍵入名稱T & gtint List & ltT & gt*長度(){
節點& ltT & gt* tempP = head-& gt;鏈接;
int count = 0;
而(tempP!=NULL)
tempP = tempP-& gt;鏈接;
count++;
}
返回計數;
}
模板& lt鍵入名稱T & gt無效列表& ltT & gt* print list(){
節點& ltT & gt* tempP = head-& gt;鏈接;
而(tempP!=NULL)
tempP-& gt;info . show();
tempP = tempP-& gt;鏈接;
}
cout & lt& ltendl
}
模板& lt鍵入名稱T & gt無效列表& ltT & gt* insert front(Node & lt;T & gt* p ){
p-》;link = head-& gt;鏈接;
head-》;link = p;
if(tail = = head)tail = p;
}
模板& lt鍵入名稱T & gt無效列表& ltT & gt* insert rear(Node & lt;T & gt* p ){
p-》;link = tail-& gt;鏈接;
尾巴-》;link = p;
tail = p;
}
模板& lt鍵入名稱T & gt無效列表& ltT & gt* insert order(Node & lt;T & gt* p ){
節點& ltT & gt* tempP = head-& gt;link,* tempQ = head//tempQ指向tempP前面的節點。
而(tempP!=NULL)
if(p-》;信息& lttempP-& gt;info)break;//找到比插入的節點大的第壹個節點,並通過tempP指向它。
tempQ = tempP
tempP = tempP-& gt;鏈接;
}
tempQ-& gt;insert after(p);//在指向節點的tempP之前和tempQ之後插入。
if(tail = = tempQ)tail = tempQ-& gt;鏈接;
}
模板& lt鍵入名稱T & gt節點& ltT & gt*列表& ltT & gt* creat node(T data){//創建壹個新節點。
節點& ltT & gt* tempP =新節點& ltT & gt(數據);
返回tempP
}
模板& lt鍵入名稱T & gt節點& ltT & gt*列表& ltT & gt* delete Node(Node & lt;T & gt* p ){
節點& ltT & gt* tempP = head
while(tempP-》;鏈接!= NULL & amp& amptempP-& gt;鏈接!= p)tempP = tempP-& gt;鏈接;
if(tempP-& gt;link = = tail)tail = tempP;
返回tempP-& gt;remove after();
}