#ifndef __CNODE_H__
#define __CNODE_H__
#include <iostream>
using namespace std;
struct stData //出生年月結構
{
int m_nYear;
int m_nMonth;
int m_nDay;
};
struct stResult //五門課成績結構
{
double m_dSubject_1; //自己改成績的名稱
double m_dSubject_2;
double m_dSubject_3;
double m_dSubject_4;
double m_dSubject_5;
};
struct stStudent //聲明學生信息的結構
{
string m_strNumber; //學生學號
string m_strName; //姓名
char m_chSex; //性別
struct stData m_stData; //出生年月
string m_strAppearance; //政治面貌
struct stResult m_stResult; //五門課成績
};
typedef class CNode
{
private:
struct stStudent m_stStudent;
CNode* m_Next;
public:
CNode(); //構造函數
~CNode(); //析構函數
void SetNodeData(); //設置結點內容的函數成員
stStudent GetNodeData(); //獲取結點內容的函數成員
void SetNodeNext(CNode* _Next); //設置結點Next指針的函數成員
void ShowNodeData(); //輸出結點內容的函數成員
CNode* GetNodeNext(); //獲取結點Next指針的函數成員
}LinkNode;
#endif
//class CLinkList
#ifndef __CLINKLIST_H__
#define __CLINKLIST_H__
#include "CNode.h"
typedef class CLinkList
{
private:
LinkNode* m_Head; //鏈表的頭指針
LinkNode m_Node; //鏈表的頭結點
public:
CLinkList(); //構造函數
~CLinkList(); //析構函數
void CreateList(); //初始化鏈表的函數成員
LinkNode* GetListNode(int _nIndex); //按位置查找指定位結點的成員函數
void InsertList(int _nIndex); //插入結點的成員函數
void DeleteList(int _nIndex); //刪除某壹結點的成員函數
LinkNode* GetHeadList(); //獲取頭指針的成員函數
void SetListData(int _nIndex); //設置鏈表中某壹結點的值的成員函數
void ShowListData(int _nIndex); //這個是現實鏈表中某壹結點值的函數成員
void DestroyList(int _nIndex); //銷毀某壹位置以後鏈表的成員函數
void ShowList(); //顯示鏈表的成員函數
}LinkList;
#endif
//class CLinkList
#include "CLinkList.h"
#include "CNode.h"
CLinkList::CLinkList()
{
cout << "這個是構造函數"<< endl;
m_Head = &m_Node; //鏈表的頭指針指向頭結點
m_Node.SetNodeNext(NULL); //將頭結點的Next指針設置為NULL;
}
CLinkList::~CLinkList()
{
cout << "這個是析構函數" << endl;
}
void CLinkList::CreateList() //以向後追加的方式創建壹個鏈表,輸入0退出
{
int nTemp = 0; //定義壹個臨時變量用於標誌程序結束
cout << "歡迎來創建鏈表 !" << endl;
CNode * pTemp = NULL; //定義壹個臨時結點指針,用來增加新結點用
CNode * pNode = m_Head; //定義壹個標記指針,首先叫其指向頭結點
while(1)
{
pTemp = new LinkNode;
cout << "請輸入下壹個結點的內容!" << endl;
pTemp->SetNodeData(); //設置鏈表中結點的內容
cout << "如果想繼續輸入下壹個學生的信息請輸入 1,否則輸入 0" << endl;
cin >> nTemp;
if ('0' == nTemp)
{
break;
}
pNode->SetNodeNext(pTemp); //讓鏈尾的Next指向新建的結點
pNode = pTemp; //將結尾元素向後移
}
cout << "創建鏈表結束" << endl;
}
LinkNode* CLinkList::GetListNode(int _nIndex)
{
cout << "這個是按位置查找指定位結點的成員函數" << endl;
LinkNode* pNode = m_Head->GetNodeNext(); //定義壹個臨時的結點指針,初始化指向頭結點
int Temp = 0; //定義壹個臨時的變量,用來標記已檢查結點的個數的
if(-1 == _nIndex) //返回頭結點(即頭指針)
{
return m_Head;
}
if(_nIndex < -1) //_nIndex控制條件
{
cout << "您輸入的是錯誤的位置!" << endl;
return 0;
}
while(pNode != NULL)
{
if(_nIndex == Temp)
{
return pNode;
}
pNode = pNode->GetNodeNext(); //臨時結點向後移動
++Temp;
}
return pNode; //沒找到結點就返回NULL
}
void CLinkList::ShowListData(int _nIndex);
void CLinkList::InsertList(int _nIndex) //插入結點的函數成員
{
cout << "這個是插入結點的成員函數" << endl;
LinkNode* pNode = GetListNode(_nIndex - 1); //定義壹個結點類的指針,指向的是要插入位置的前壹指針
LinkNode* pTemp = new CNode; //定義壹個臨時結點指針,用來增加新結點用
pTemp->SetNodeData(); //設置插入結點的內容
pTemp->SetNodeNext(pNode->GetNodeNext());
pNode->SetNodeNext(pTemp);
}
void CLinkList::DeleteList(int _nIndex)
{
cout << "這個是刪除某壹結點的成員函數" << endl;
LinkNode* pNode = GetListNode(_nIndex - 1); //定義壹個結點類的指針,指向的是要刪除位置的前壹指針
LinkNode* pTemp = NULL; //定義壹個臨時結點指針,用來指向要刪除的結點
pTemp =pNode->GetNodeNext(); //把pTemp指向要刪除的結點
pNode->SetNodeNext(pTemp->GetNodeNext()); //把pNode指向要刪除的結點的後壹個結點
delete pTemp; //刪除結點
pTemp = NULL;
}
LinkNode* CLinkList::GetHeadList()
{
cout << "這個是獲取頭指針的成員函數" << endl;
return m_Head;
}
void CLinkList::SetListData(int _nIndex)
{
cout << "這個是設置鏈表中某壹結點的值的成員函數" << endl;
CNode *pNode = GetListNode(_nIndex); //定義壹個結點類的指針,指向的是要修改內容位置的結點
pNode->SetNodeData(); //修改內容
}
void CLinkList::ShowListData(int _nIndex)
{
cout << "這個是顯示鏈表中某壹結點值的成員函數" << endl;
CNode *pNode = GetListNode(_nIndex); //定義壹個結點類的指針,指向的是要獲取內容位置的結點
pNode->ShowNodeData(); //返回想要得到位置的結點內容
}
void CLinkList::DestroyList(int _nIndex)
{
cout << "這個是銷毀某壹位置以後鏈表的成員函數" << endl;
LinkNode* pTemp = GetListNode(_nIndex - 1); //定義壹個結點指針,指向要銷毀位置的前壹結點
LinkNode* pNode = pTemp->GetNodeNext(); //定義壹個結點指針,指向要銷毀位置的結點
while(pTemp->GetNodeNext() != NULL) //銷毀動作的結束條件或初始條件
{
pTemp->SetNodeNext(pNode->GetNodeNext()); //把需要銷毀的位置的前結點的Next指向銷毀位置的下壹個結點
delete pNode; //銷毀結點
pNode = pTemp->GetNodeNext(); //把pNode重新指向要銷毀位置的結點
}
}
void CLinkList::ShowList()
{
cout << "這個是顯示鏈表的成員函數" << endl;
int nTemp = 0; //定義壹個臨時的整形變量用來控制輸入的個數
LinkNode* pTemp = m_Head->GetNodeNext(); //定義壹個結點類指針,指向第0位的結點
if(NULL == pTemp)
{
cout << "這是個空鏈" << endl;
}
while(pTemp != NULL)
{
pTemp->ShowNodeData();
++nTemp;
if(0 == nTemp % 5 && nTemp != 0) //控制每行只能輸出5個結點的內容
{
cout << endl;
}
pTemp = pTemp->GetNodeNext();
}
}
//class CNode
#include "CNode.h"
CNode::CNode() //構造函數
{
//m_stStudent = {0};
m_Next = NULL;
}
CNode::~CNode() //析構函數
{
}
void CNode::SetNodeData()
{
char* pNumber = new char[30]; //用來接收字符串的臨時變量
char* pName = new char[30];
char* pAppearance = new char[30];
cout << "學生學號: " << endl;
cin >> pNumber;
m_stStudent.m_strNumber = pNumber;
cout << "姓名: " << endl;
cin >> pName;
m_stStudent.m_strName = pName;
cout << "性別: " << endl;
cin >> m_stStudent.m_chSex;
cout << "出生年月: " << endl;
cout << "m_stData.m_nYear" << endl;
cin >> m_stStudent.m_stData.m_nYear;
cout << "m_stData.m_nMonth" << endl;
cin >> m_stStudent.m_stData.m_nMonth;
cout << "m_stData.m_nDay" << endl;
cin >> m_stStudent.m_stData.m_nDay;
cout << "政治面貌: " << endl;
cin >> pAppearance;
m_stStudent.m_strAppearance = pAppearance;
cout << "五門課成績: " << endl;
cout << "m_dSubject_1: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_1;
cout << "m_dSubject_2: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_2;
cout << "m_dSubject_3: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_3;
cout << "m_dSubject_4: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_4;
cout << "m_dSubject_5: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_5;
delete []pNumber; //釋放內存
pNumber = NULL; //指針置空
delete []pName; //釋放內存
pName = NULL;
delete []pAppearance; //釋放內存
pAppearance = NULL;
}
stStudent CNode::GetNodeData() //返回結點內容(即學生信息)
{
return m_stStudent;
}
void CNode::SetNodeNext(CNode* _Next)
{
m_Next = _Next;
}
void CNode::ShowNodeData()
{
const char* pNumber = m_stStudent.m_strNumber.c_str(); //用來接收字符串的臨時變量
const char* pName = m_stStudent.m_strNumber.c_str();
const char* pAppearance = m_stStudent.m_strAppearance.c_str();
cout << "學生學號: " << pNumber << '\t' << "姓名: " << pName << '\t' << "性別: " << m_stStudent.m_chSex;
cout << "出生年月: " << m_stStudent.m_stData.m_nYear << ',' << m_stStudent.m_stData.m_nMonth << ',' << m_stStudent.m_stData.m_nDay;
cout << "政治面貌: " << pAppearance << "五門課成績: " << endl;
cout << "m_dSubject_1: "<< m_stStudent.m_stResult.m_dSubject_1<< endl;
cout << "m_dSubject_2: "<< m_stStudent.m_stResult.m_dSubject_2<< endl;
cout << "m_dSubject_3: "<< m_stStudent.m_stResult.m_dSubject_3<< endl;
cout << "m_dSubject_4: "<< m_stStudent.m_stResult.m_dSubject_4<< endl;
cout << "m_dSubject_5: "<< m_stStudent.m_stResult.m_dSubject_5<< endl;
}
CNode* CNode::GetNodeNext()
{
return m_Next;
}
#include "CLinkList.h"
#include "CNode.h"
void Text(); //測試函數聲明
int main()
{
cout << "這是mian函數" << endl;
Text();
return 0;
}
void Text()
{
cout << "這個是測試函數" << endl;
LinkList* pList = new LinkList; //創建壹個內存鏈表對象
cout << "------------------CreateList-----------------------------" << endl;
pList->CreateList(); //初始化鏈表的函數成員
pList->ShowList();
cout << endl;
cout << "------------------GetListNode-----------------------------" << endl;
LinkNode* pNode = NULL; //定義壹個臨時的結點類指針用於檢測查找函數成員
pNode = pList->GetListNode(3); //按位置查找指定位結點的成員函數的測試
if(pNode)
{
cout << "用按位置查找的方法找到了指定位結點" << endl;
}
else
{
cout << "對不起,用按位置查找的方沒有找到指定位結點" << endl;
}
cout << endl;
cout << "------------------InsertList-----------------------------" << endl;
pList->InsertList(0); //插入結點的成員函數的測試
pList->ShowList();
cout << endl;
cout << "------------------DeleteList-----------------------------" << endl;
pList->DeleteList(0); //刪除某壹結點的成員函數的測試
pList->ShowList();
cout << endl;
cout << "------------------GetHeadList-----------------------------" << endl;
pNode = NULL;
pNode = pList->GetHeadList(); //獲取頭指針的成員函數的測試
if(pNode)
{
cout << "已經返回了頭指針" << endl;
}
else
{
cout << "對不起,頭指針為空" << endl;
}
cout << endl;
cout << "------------------GetHeadList-----------------------------" << endl;
pList->SetListData(3); //設置鏈表中某壹結點的值的成員函數的測試
pList->ShowList();
cout << endl;
cout << "------------------GetListData-----------------------------" << endl;
cout << "pList->ShowListData(3) =";
pList->ShowListData(3); //獲取鏈中某壹結點值的成員函數的測試
cout << endl;
cout << "------------------DestroyList(3)-----------------------------" << endl;
pList->DestroyList(3); //銷毀第3位置以後鏈表的成員函數的測試
pList->ShowList();
cout << endl;
cout << "------------------DestroyList(0)-----------------------------" << endl;
pList->DestroyList(0); //銷毀第0位置以後鏈表的成員函數的測試
pList->ShowList();
cout << endl;
delete pList; //釋放內存
pList = NULL; //指針置空
}
妳的要求太多 , 沒仔細看, 我把我給別人寫的賦值給妳吧 , 我已經寫的很全了,程序有問題可以給我留言