#include<iostream>
#include<string>
using namespace std;
class student
{
public: //公有权限的类......还不如搞个结构了
int num; //也不知道做什么的。没注释 似乎是学生的编号
string name; //学生名字
student *next; //不知道时候做什么的。
};
student *head,*node,*str; //不知道是做什么的 node似乎是一个结点的指针,,head好像是头指针?(为什么不定义在类里面呢?)?(没头结点)
student create(int k) //创建
{
string name[5]={"za","hha","ss","ssssss","ererere"}; //string类的对象数组
for(int i=1;i<=5;i++)
{
node=new student; //申请动态的结点 node是第一个指针
if(i==1) //好像是头结点
{
node->name=name[i-1];
node->num=i;
node->next=NULL;
head=node;
str=node; //str又是什么东西呢?好像要保存这结点指针的临时变量
}
else
{
node->name=name[i-1];
node->num=i;
node->next=NULL;
str->next=node;
str=str->next;
}
}
return *head;
}
void insert(int i) //插入
{
node=new student; //申请了结点
node->num=22222;
node->name="aasdasdasdasdasdasdsa";
node->next=NULL;
str=head;
if(head->num==i) //在数字开头插入head
{
node->next=head;
head=node;
}
else
{
while(str->next->num!=i||str->next!=NULL)
//这里有两个问题 第一 str->next->num==node->num(问题一1:node->num=22222,,不好意思你找不到他们相等的时候,所以第一条永远不会成立)
//或者str->next==node都出问题 (问题一2:node是你用来申请动态结点的指针,他不在链表里面, 所以str->next==node这个是也永远不会成立的。所以你如果那么写的话
//那个while就是while(0)相当于不执行while)
//但是node->num用i来代替就没有问题 求解
{
str=str->next;
}
if(str->next==NULL) //第二个问题就是这儿 这里考虑的是检查所有的结果没有发现的要找的 但是这里还是出问题 求解
//问题二:不知道这里你有什么问题, 你没有说清楚,不过我感觉应该是if(NULL == str)
//因为如果你最后一个结点就是你要找到,但这里仍然会直接退出并说我没有找到你要的结点
{
cout<<"对不起,没有找到你要找的那个数字"<<endl;
}
else //这也有问题,不过问题不大,,只是插入的结点是插在你要找到结点的后面的
{
node->next=str->next;
str->next=node;
}
}
}
void inverse(student *head) //这个函数不知道做什么的
{
student *str,*p,*q; //没注释, 有是不知所谓的好几个指针
p=head;
q=NULL;
while(p!=NULL)
{
str=q;
q=p;
p=p->next;
q->next=str;
}
head=q;
//问题3 这里本来想返回head的值的,最后通过print(head),但是最终
//执行的结果却不是这样子的值输出了1 za
//问题三:好像通过这么一大串操作,结果只是把你的第一个结点给拿来出来,也就是你所谓的链,后面的部分都给你丢掉了,
//我画图不好没办法给你用图形解释, 反正这里返回的只是你的第一个结点
}
void print(student *head)
{
str=head;
while(str!=NULL)
{
cout<<str->num<<" "<<str->name<<" "<<endl;
str=str->next;
}
}
void main()
{
int t;
create(5);
print(head);
// cout<<"请输入你要删除的数字吧"<<endl;
// cin>>t;
// delete(t); //这个是要做什么,我没懂, 上面没有这个函数 , 要说是释放内存也不能这么写,。。
// 不懂,太深奥
//想要删除某结点, 要用指针操作的 ,不是直接delete的
// print(head);
cout<<"请输入要插入在它前面的的数字吧"<<endl;
int k;
cin>>k;
insert(k); //似乎没问题,我没太仔细看不过没有明显错误
inverse(head); //错误,,上面已写出
print(head);
}
//这种问题应该怎么改啊
//这种问题的很难改, 要是我就重新写一遍,,全是错误 , 而且变量太乱了,好难认识的出。
下卖弄是我给别人写的 , 你自己参考
//class CLinkList
#include "CLinkList.h"
#include "CNode.h"
CLinkList::CLinkList()
{
cout << "这个是构造函数"<< endl;
m_Head = &m_Node; //链表的头指针指向头结点
m_Node.SetNodeData(0, 0); //给头结点的内容赋0值
m_Node.SetNodeNext(NULL); //将头结点的Next指针设置为NULL;
}
CLinkList::~CLinkList()
{
cout << "这个是析构函数" << endl;
}
void CLinkList::CreateList() //以向后追加的方式创建一个链表,输入0退出
{
int nScore = 0; //定义一个临时的整形变量来保存数据
char chNum = 0; //定义一个临时的字符型变量来保存数据
cout << "欢迎来创建链表 !" << endl;
CNode * pTemp = NULL; //定义一个临时结点指针,用来增加新结点用
CNode * pNode = m_Head; //定义一个标记指针,首先叫其指向头结点
while(1)
{
pTemp = new LinkNode;
cout << "请输入下一个结点的内容!" << endl;
cin >> nScore; //输入0退出
cin >> chNum;
if ('0' == nScore)
{
break;
}
pTemp->SetNodeData(nScore, chNum); //给新结点的内容赋值
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::InsertList(int _nIndex, int _nScore, char _chNum) //插入结点的函数成员
{
cout << "这个是插入结点的成员函数" << endl;
LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要插入位置的前一指针
LinkNode* pTemp = new CNode; //定义一个临时结点指针,用来增加新结点用
pTemp->SetNodeData(_nScore, _chNum); //设置插入结点的内容
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, int _nScore, char _chNum)
{
cout << "这个是设置链表中某一结点的值的成员函数" << endl;
CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要修改内容位置的结点
pNode->SetNodeData(_nScore, _chNum); //修改内容
}
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()
{
int m_nScore = 0;
char m_chNum = 0;
m_Next = NULL;
}
CNode::~CNode()
{
}
void CNode::SetNodeData(int _nScore, char _chNum)
{
m_nScore = _nScore;
m_chNum = _chNum;
}
void CNode::ShowNodeData()
{
cout << m_nScore << '\t' << m_chNum << endl;
}
void CNode::SetNodeNext(CNode* _Next)
{
m_Next = _Next;
}
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, 9, 'x'); //插入结点的成员函数的测试
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, 7 , '@'); //设置链表中某一结点的值的成员函数的测试
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; //指针置空
}
#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, 9, 'x'); //插入结点的成员函数的测试
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, 7 , '@'); //设置链表中某一结点的值的成员函数的测试
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; //指针置空
}
//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, int _nScore, char _chNum); //插入结点的成员函数
void DeleteList(int _nIndex); //删除某一结点的成员函数
LinkNode* GetHeadList(); //获取头指针的成员函数
void SetListData(int _nIndex, int _nScore, char _chNum); //设置链表中某一结点的值的成员函数
void CLinkList::ShowListData(int _nIndex); //这个是现实链表中某一结点值的函数成员
void DestroyList(int _nIndex); //销毁某一位置以后链表的成员函数
void ShowList(); //显示链表的成员函数
}LinkList;
#endif
//class CNode.h
#ifndef __CNODE_H__
#define __CNODE_H__
#include <iostream>
using namespace std;
typedef class CNode
{
private:
int m_nScore;
char m_chNum;
CNode* m_Next;
public:
CNode(); //构造函数
~CNode(); //析构函数
void SetNodeData(int _nScore, char _chNum); //设置结点内容的函数成员
void ShowNodeData(); //输出结点内容的函数成员
void SetNodeNext(CNode* _Next); //设置结点Next指针的函数成员
CNode* GetNodeNext(); //获取结点Next指针的函数成员
}LinkNode;
#endif
内容应该差不太多的 , 自己慢慢看吧
不懂得地方在我博客上问就好了
http://owlwisp.blog.sohu.com/