关于链表的C++的程序问题

#include<iostream>
#include<string>
using namespace std;
class student
{
public:
int num;
string name;
student *next;
};
student *head,*node,*str;
student create(int k) //创建
{
string name[5]={"za","hha","ss","ssssss","ererere"};
for(int i=1;i<=5;i++)
{
node=new student;
if(i==1)
{
node->name=name[i-1];
node->num=i;
node->next=NULL;
head=node;
str=node;
}
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或者str->next==node都出问题 但是node->num用i来代替就没有问题 求解
{
str=str->next;
}
if(str->next==NULL) //第二个问题就是这儿 这里考虑的是检查所有的结果没有发现的要找的 但是这里还是出问题 求解
{
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;
//deleted(t);
//print(head);
// cout<<"请输入要插入在它前面的的数字吧"<<endl;
// int k;
// cin>>k;
// insert(k);
inverse(head);
print(head);
}
}
这种问题应该怎么改啊

#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/
温馨提示:内容为网友见解,仅供参考
无其他回答

c++ 链表,,求指导,程序崩溃,line:1044
1.链表的最后一个节点的next的值,是否设置为NULL了,如果没有设置,到了最后一个节点的时候,就会出现崩溃.2.你的链表中的每个节点的next值,是否都对了,如果有任一个节点的next没有指向有用的节点的话,就会访问不被允许访问的内存,导致崩溃.3.考虑下在进入循环的第一次是否就有问题,因为循环里,并没...

c++链表问题
答:链表的结构就是图中所示了,r就是S的指针域指向的下一个节点。提示:r的指针域不为NULL,不能作为链表的尾节点哦,要给r->link=NULL;

c++ 链表,,求指导,程序崩溃,line:1044
链表的最后一个节点的next的值,是否设置为NULL了,如果没有设置,到了最后一个节点的时候,就会出现崩溃.你的链表中的每个节点的next值,是否都对了,如果有任一个节点的next没有指向有用的节点的话,就会访问不被允许访问的内存,导致崩溃.考虑下在进入循环的第一次是否就有问题,因为循环里,并没有判断p...

c++ MFC 里的链表问题(内详)
链表是一种数据结构,就像是一个一个的珠子串起来的链子,每个珠子就是一个结构体变量(当然这是C语言中的说法,要是是C++的话,每个珠子就是一个对象了),这种数据结构可以很方便地的访问每个元素,一般它是与数组相对的,数组是串行的,按照索引来访问元素,而链表是靠结构体中存储的下一个元素的...

C++链表合并编译正确,运行完跳出终止调试程序的框框
我没仔细看算法,但是有一个致命的问题,LinkList A,B会析构两次!因为你void LinkList::LinkSort(LinkList A,LinkList B)是值传递,这个函数执行完成后A,B就会析构,虽然与原来的A,b是不同的A,B,但后面那些节点地址相同,析构以后链表后面所有节点都释放掉了 然后返回原函数,函数结束后会...

c++单链表的遍历与长度计算,求这题的代码
struct node { int data;struct node *next;} ;创建单链表后,最后一个结点的next是NULL,据此来遍历表,获得长度。void get_len( struct node *head ){ struct node *p=head->next ;int len=0;while ( p ){ len++;p=p->next;} head->data=len ; \/\/存储长度到头结点 } ...

用C++建立一个有序链表 的程序?
struct node{ int v;struct node *next;};int n;int main(){ struct node *head,*p;head = (struct node*)malloc(sizeof(struct node));printf("请输入节点个数:");scanf("%d",&n);int i;p=head;\/\/输入n个数字 for(i=0;i<n;i++){ printf("输入一个数字:");scanf("%d",&...

c++链表栈问题
1.建立抽象模型,说起来这件事得追溯到C++本身的结构上:从广义上看,类是一个数据操作集合体,即使数据结构也不外乎如是。那么我们必须知道栈需要什么——这是一切问题的起点。数据结构是数据模型的实现,围绕数据为中心,操作为主要手段的语义模型。真正具体化到C++的类中,我们就是要确定储存结构(...

C语言链表问题 DEVC++编译出error:too many arguments to functi...
你在main函数内声明了一个int deleteNode();函数,这个表明deleteNode函数是没有参数的。所以你后面的调用才出了问题。其实完全没有必要再声明的呀。

求大神教我c++ 谢啦 是关于链表删除的
int data;Node *next;};Node * ins(Node *head, int x){ Node *p,*q,*t;t=new Node;t->data=x;t->next=0;if(head==0){ head=t;return head;} q=head;p=head->next;while(p!=0){ q=p;p=p->next;} q->next=t;return head;} Node * del(Node *head, int n){ No...

相似回答