用c++写了一个单链表

magic_an001 2012-03-06 11:38:32
最后一个节点老是出错,谁能帮我看下怎么回事?

#include <iostream>
#include <string>
using namespace std;

struct student
{
string name;
int age;
string sex;
student *next;
};
student *head=NULL;
student * create()
{
student *snow,*send;
snow=new student;
cout<<"输入学生姓名、年龄、性别"<<endl;
cin>>snow->name>>snow->age>>snow->sex;
cout<<endl;
send=snow;
while(snow->name!="end")
{
if(!head)
head=snow;
else
{
send=new student;
snow->next=send;
cout<<"输入学生姓名、年龄、性别"<<endl;
cin>>send->name>>send->age>>send->sex;
snow=send;
}
}
snow->next=NULL;
delete send;
snow=NULL;
return head;
}
void print(student *ss)

{
while(ss) ////////输出结束时会谈错误,最后一个节点不符合要求,可是我已经赋值NULL了
{
...全文
327 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic_an001 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wangchentangjuan 的回复:]

用C++还写单链表 我表示无解
[/Quote]
消磨下时间
magic_an001 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wangchentangjuan 的回复:]

用C++还写单链表 我表示无解
[/Quote]
呵呵,消磨小时间
magic_an001 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 duoluoo 的回复:]

send=snow;
...
head=snow;
...
delete send;
snow=NULL;
return head;

求解释~~~~
3个指针都指向一个同一个节点 然后你delete了一次 虽然将snow置为NULL了
其他2个好像还指向被你拆了房子的废墟,俗称野指针
[/Quote]
恩,解决了,谢谢
magic_an001 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wjj474957860 的回复:]

C/C++ code
#include <iostream>
#include<iomanip>
using namespace std;
#include <iostream>

using namespace std;
struct ListNode
{
int data;
ListNode *next;
}; /……
[/Quote]
好的,谢谢,拜读一下
wangchentangjuan 2012-03-09
  • 打赏
  • 举报
回复
用C++还写单链表 我表示无解
酒鬼 2012-03-09
  • 打赏
  • 举报
回复
无语。较上劲了。。【code=C/C++】要插入的代码【/code】。全角中括号改成英文的,用的时候。。。
酒鬼 2012-03-09
  • 打赏
  • 举报
回复
要插入的代码

酒鬼 2012-03-09
  • 打赏
  • 举报
回复
东西不好用完全是造东西人的问题。
插代码放在“
“的中间即
要插入的代码

你说它光标要能自动跳到这中间多好。。。
minchieh 2012-03-09
  • 打赏
  • 举报
回复
send=snow;
...
head=snow;
...
delete send;
snow=NULL;
return head;

求解释~~~~
3个指针都指向一个同一个节点 然后你delete了一次 虽然将snow置为NULL了
其他2个好像还指向被你拆了房子的废墟,俗称野指针
w378567402 2012-03-07
  • 打赏
  • 举报
回复
这是我以前写的链表:
#ifndef CTEMPALTELIST_H
#define CTEMPALTELIST_H
#include <assert.h>
#define NULL 0
#include <iostream>
using namespace std;

template<class T>
class CTempalteList
{
typedef struct LIST
{
T Data;
struct LIST* Next;
}CList;

public:
CTempalteList();
CTempalteList(const CTempalteList& List);
virtual ~CTempalteList();
protected:
private:
CList* m_Head;//头
CList* m_EndList;//末尾元素
unsigned int m_Count;//计数
public:
void Add(const T Data);//加入元素
const T GetAt(const unsigned int Index)const;//通过索引得到该节点的值
const unsigned int GetSize()const;//获取链表的大小
T operator[](const unsigned int Index)const;//重载[]运算符
friend const CTempalteList<T> operator+( const CTempalteList<T>& Elem1, const CTempalteList<T>& Elem2)//连接两个链表得到新的链表
{
CTempalteList<T> List;
for(int i=0;i<Elem1.m_Count;i++)
{
List.Add(Elem1.GetAt(i));
}
for(int i=0;i<Elem2.m_Count;i++)
{
List.Add(Elem2.GetAt(i));
}
return List;
}
void operator=(const CTempalteList& List);
void Remove();//删除所有的元素
void Remove(const unsigned int Index);//删除指定位置的值
int Insert(const unsigned int Index,T NewData);//在指定位置插入一个值,返回为链表插入后的长度,如果插入失败则返回为原来的长度否则为新的长度
int Insert(const unsigned int Index,CTempalteList *catList);//在指定位置插入一个值,返回为链表插入后的长度,如果插入失败则返回为原来的长度否则为新的长度
int SetAt(const unsigned int Index,T Data);//修改指定位置的数据
private:
inline CList* GetDataList(const unsigned int Index)const;
};
template<class T>
typename CTempalteList<T>::CList* CTempalteList<T>::GetDataList(const unsigned int Index)const
{
CList* Elem=m_Head;
for(int i=0;i<m_Count;i++)
{
if(i==Index)break;
Elem=Elem->Next;
}
return Elem;
}


#endif // CTEMPALTELIST_H

#include "F:\workspace\CTempalteList\include\\CTempalteList.h"

template<class T>
CTempalteList<T>::CTempalteList()
{
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
//ctor
}
template<class T>
CTempalteList<T>::CTempalteList(const CTempalteList& List)
{
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
for(int i=0;i<List.m_Count;i++)
Add(List.GetAt(i));
}
template<class T>
CTempalteList<T>::~CTempalteList()
{ //dtor
Remove();
}
template<class T>
void CTempalteList<T>::Add(const T Data)
{
CList* Elem=new CList();
Elem->Data=Data;
Elem->Next=NULL;
if(m_Head==NULL&&m_EndList==NULL)
{
m_EndList=m_Head=Elem;
}
m_EndList=m_EndList->Next=Elem;
m_Count++;
}
template<class T>
const T CTempalteList<T>::GetAt(const unsigned int Index) const
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return NULL;
return GetDataList(Index)->Data;
}
template<class T>
const unsigned int CTempalteList<T>::GetSize()const
{
return m_Count;
}
template<class T>
T CTempalteList<T>::operator[](const unsigned int Index)const
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return NULL;
return GetDataList(Index)->Data;
}


template<class T>
void CTempalteList<T>::operator=(const CTempalteList<T>& List)
{
if(List.m_Head!=NULL)
{
Remove();
for(int i=0;i<List.m_Count;i++)
Add(List.GetAt(i));

}
// return *this;
}

template<class T>
void CTempalteList<T>::Remove()
{
if(m_Head!=NULL)
{
CList* NextList=NULL;
for(int i=0;i<m_Count;i++)
{
NextList=m_Head->Next;
delete m_Head;
m_Head=NextList;
}
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
}
}
template<class T>
void CTempalteList<T>::Remove(const unsigned int Index)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return;
if(Index==0)
{
CList* NextList=m_Head->Next;
delete m_Head;
m_Head=NextList;
}
else
{
CList* PreList=GetDataList(Index-1);//得到前一个元素的指针
CList* NextList=PreList->Next->Next;
if(PreList->Next==m_EndList)m_EndList=PreList;//防止删除最后一个指针时还能访问
delete PreList->Next;
PreList->Next=NextList;
}
m_Count--;
}
template<class T>
int CTempalteList<T>::Insert(const unsigned int Index,T NewData)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return m_Count;
CList* NewList=new CList();
NewList->Data=NewData;
if(Index==0)
{
NewList->Next=m_Head;
m_Head=NewList;
}
else
{
CList* PreList=GetDataList(Index-1);//得到前一个元素的指针
NewList->Next=PreList->Next;
PreList->Next=NewList;
}
m_Count++;
return m_Count;
}
template<class T>
int CTempalteList<T>::Insert(const unsigned int Index,CTempalteList *catList)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return m_Count;
const int Size=catList->GetSize();
CList* oldEndList=GetDataList(m_Count-1);//记录插入前最后元素的指针
//先将待插入的元素全部插入链表后面
for(int i=0;i< Size;i++)
{
Add(catList->GetAt(i));
}
CList* NewStartList=oldEndList->Next;//记录新插入元素的头指针
CList* NewEndList=GetDataList(m_Count-1);//记录插入后最后元素的指针
oldEndList->Next=NULL;//将新增的链表暂时与旧表断开
if(Index==0)
{
NewEndList->Next=m_Head;
m_Head=NewStartList;
}
else
{
CList* InertList=GetDataList(Index-1);
NewEndList->Next=InertList->Next;
InertList->Next=NewStartList;
}
}
template<class T>
int CTempalteList<T>::SetAt(const unsigned int Index,T Data)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return -1;
CList* PreList=GetDataList(Index);//得到前一个元素的指针
assert(PreList);
PreList->Data=Data;
}
int main(void)
{
CTempalteList<int> list;
for(int i=0;i<5;i++)
list.Add(i);
list=list+list;
list.SetAt(0,100);
for(int i=0;i<list.GetSize();i++)
cout<<list.GetAt(i)<<" ";
return 0;
magic_an001 2012-03-07
  • 打赏
  • 举报
回复
恩 我觉得deajosha和Kevin_qing和kaisawind说的都很有道理,刚开始学单链表。。。我自己也觉得逻辑比较混乱 呵呵
Spy 2012-03-07
  • 打赏
  • 举报
回复
我想说上面贴的代码多了

using namespace std;
#include <iostream>

可能是电脑剪切板的问题,去了就好
Spy 2012-03-07
  • 打赏
  • 举报
回复
#include <iostream>
#include<iomanip>
using namespace std;
#include <iostream>

using namespace std;
struct ListNode
{
int data;
ListNode *next;
}; //定义单链表的结点类型node
class LinkList //定义LinkList类
{
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void CreateListTail(); //成员函数CreateListTail,用尾插入法建立单链表
void CreateListHead(); //成员函数CreateListTail,用头插入法建立单链表
void ListInsert(); //成员函数ListInsert,插入元素
void ListDelete(); //成员函数ListDelete,删除元素
void ListFind(); //成员函数ListFind,查找元素
void Listlength(); //成员函数Listlength,显示单链表长度
void Listreverse(); //成员函数Listreverse,单链表逆值
void ListPrint(); //成员函数ListPrint,显示当前链表
public:
ListNode *head,*tail;int length;
};
/////////////////////////////////////////////////////////////////////////////////////LinkList::LinkList()
{
head=tail=NULL;
length=0;
}

LinkList::~LinkList()
{
ListNode *p;
while(head)
{
p=head;
head=head->next;
delete p;
}
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::CreateListTail()
{
ListNode *p;
int i,n;
cout<<"请输入你想输入元素的个数:";
cin>>n;
length=n;
cout<<"请输入元素:";
head=tail=new ListNode;
cin>>head->data;
for(i=1;i<n;i++)
{
p=new ListNode;
cin>>p->data;
tail->next=p;
tail=p;
}
tail->next=NULL;
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::CreateListHead()
{
ListNode *p;
int i,n;
cout<<"请输入你想输入元素的个数:";
cin>>n;
length=n;
cout<<"请输入元素:";
head=tail=new ListNode;
cin>>head->data;
for(i=1;i<n;i++)
{
p=new ListNode;
cin>>p->data;
p->next=head;
head=p;
}
tail->next=NULL;
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::ListInsert()
{
int x,insert;ListNode *p,*o,*q,*t;
p=new ListNode;
cout<<"请你输入位置和元素:";
cin>>x>>insert;
if(x<1||x>length+1)
{
cout<<"Input Error!"<<endl;
}
else
{
if(x==1)
{
p->next=head;
head=p;
head->data=insert;
}
else
{
int j=1;
o=q=head;
while(j<x)
{
q=o;
o=o->next;
j++;
}
t=new ListNode;
t->next=o;
q->next=t;
t->data=insert;
}
length++;
}

}
/////////////////////////////////////////////////////////////////////////////////////void LinkList::ListDelete()
{
int x,j=1;ListNode *p,*q;
cout<<"请输入你想删除的位置:";
cin>>x;
if(x<1||x>length+1)
{
cout<<"Delete Error!"<<endl;
}
else
{
if(x==1)
{
p=head;
head=head->next;
delete p;
}
else
{
p=q=head;
while(j<x)
{
q=p;
p=p->next;
j++;
}
q->next=p->next;
delete p;

}
length--;
}

}
///////////////////////////////////////////////////////////////////////////////////
void LinkList::ListFind()
{
int Find;ListNode *p;
cout<<"请你输入待查找的元素:";
cin>>Find;
p=head;
while(p!=0 && p->data!=Find)
{
p=p->next;
}
if (p!=NULL) cout<<"找到此元素!"<<endl;
else
cout<<"没有找到此元素!"<<endl;
cout<<"请你选择你想要的功能:";
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::Listlength()
{
cout<<"该链表长度为:"<<length<<endl;
cout<<"请你选择你想要的功能:";
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::Listreverse()
{
ListNode *q,*p=head->next;
head->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=head;
head=q;
}

}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::ListPrint()
{
ListNode *p=head;
cout<<"当前链表为:";
while(p)
{
cout<<p->data<<setw(3);
p=p->next;
}
cout<<endl;
cout<<"请你选择你想要的功能:";
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
int main()
{
int t=1;LinkList s;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"/////////////////欢迎来到链表系统////////////////////"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"菜单:"<<endl;
cout<<"0: 头建立链表"<<endl;
cout<<"1:尾建立链表"<<endl;
cout<<"2:插入元素"<<endl;
cout<<"3:删除元素"<<endl;
cout<<"4:查找元素"<<endl;
cout<<"5:显示链表长度"<<endl;
cout<<"6:链表逆值"<<endl;
cout<<"7:直接退出"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"请你选择你想要的功能:";

while (t==1)
{
int choice;
cin>>choice;
switch (choice)
{
case 0:s.CreateListHead();s.ListPrint();break;
case 1:s.CreateListTail();s.ListPrint();break;
case 2:s.ListInsert();s.ListPrint();break;
case 3:s.ListDelete();s.ListPrint();break;
case 4:s.ListFind();break;
case 5:s.Listlength();break;
case 6:s.Listreverse();s.ListPrint();break;
case 7:t=0;cout<<"系统已退出!";break;
}
}
return 0;
}

我把整个运用链式表的运用都贴上,仅供参考学习……
小布 2012-03-07
  • 打赏
  • 举报
回复
教你一招 你最后一个节点指向head的地址 一般人儿我不告诉他
Heaven13483 2012-03-07
  • 打赏
  • 举报
回复
好乱的逻辑
从头来过 2012-03-07
  • 打赏
  • 举报
回复
节点分为两部分:节点的内容和指向下一个节点的指针,最后一个指针指向NULL
Spy 2012-03-07
  • 打赏
  • 举报
回复
code=C/C++]代码插在这里就行了[/code]
Kevin_qing 2012-03-07
  • 打赏
  • 举报
回复
单向链表最好只从头插入数据,这样只用保存头指针的值,处理上面简单,也不容易出错。

面包大师 2012-03-06
  • 打赏
  • 举报
回复
代码全一些啊、、、
magic_an001 2012-03-06
  • 打赏
  • 举报
回复
程序没插完。。。新手 不会插入代码
void print(student *ss)
{
while(ss) ////////输出结束时会谈错误,最后一个节点不符合要求,可是我已经赋值NULL了
{
cout<<ss->name<<"\t"<<ss->age<<"\t"<<ss->sex<<endl;
ss=ss->next;
}
}
int main()
{
student *real=create();
print(real);
return 1;
}
加载更多回复(7)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧