c++链表简单操作程序求修改

penline 2011-05-04 08:47:35
下面是简单的链表处理,可是使用输入操作的时候都系统强制停止运行了,麻烦帮忙看看是哪里的问题,谢谢啦


#include<iostream>
using namespace std;

struct list
{
int num;
list *next;
};
list *head; //定义一个头指针

//******************************************************************************************创建链表:初始化

list *Create()
{
list *p;
list *end;
p=new list; //开辟一个新的空间
cin>>p->num;
head=NULL;
end=p;
while(p->num!=0)
{
if(head==NULL)
head=p;
else
{ end->next=p;
end=p;}
p=new list;
cin>>p->num;
}
end->next=NULL;
delete p;
return(head);
}
//***********************************************************************************删除操作

void Delete(struct list* &head,int num)
{
list *p;
if(!head)
{
cout<<endl<<"空表 不能进行删除操作"<<endl;
return ;
}
if(head->num==num)
{
p=head;
head=p->next;

delete p;
cout<<endl<<num<<" 已经被删除。\n";

return;
}
for(list *end=head;end->next;end=end->next)
{
if(end->next->num==num)
{
p=end->next;
end->next=p->next;
delete p;
cout<<endl<<num<<" 已经被删除"<<endl;
return ;
}
}
cout<<num<<" 不能找到\n";
return ;
}

//**************************************************************************************显示链表信息
void Display(list *head)
{
if(head==NULL)
{
cout<<"空表,不能输出..."<<endl;
return ;
}
int ID=1;
while(head)
{
//head->num=ID;
cout<<head->num<<endl;
head=head->next;
ID++;
}
}

//*******************************************************************************************插入操作

void Insert(list *&head,int stu)
{
list *q;
q->num=stu;
if(head==NULL)
{
head->num=stu;
cout<<endl<<"The command completed successfully..."<<endl;
return ;
}
if(head->num>=stu)
{
q=head;
head->num=stu;
cout<<endl<<"The command completed successfully..."<<endl;
return ;
}
list *p=head;

while(p->next&&p->next->num<stu)
{ p=p->next;
q->next=p->next;
p->num=stu;
cout<<endl<<"The command completed successfully..."<<endl;
}
}

//Function main********************************************************************
void main()
{
long number;
int choice,stu;list *list;
cout<<"*******************************************************************\n";
head=Create();
Display(head);
for(;;)
{
cout<<"1.创建一个链表\n"
<<"2.插入链表数值\n"
<<"3.删除链表数值\n"
<<"4.显示链表\n";
cout<<"\n请选择( 1 2 3 4):\n";
cin>>choice;
switch(choice) //switch_start语句
{
case '1':
list=Create();break;
case '2':
cout<<"\n输入你要插入的数值\n";
cin>>stu;
Insert(head,stu);
Display(head);
break;
case '3':
cout<<"\n请输入你要删除的数值\n";
cin>>number;
Delete(head,number);
Display(head);
break;
case'4':
Display(head);break;
}
}
}
...全文
365 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoguangzaia 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 penline 的回复:]

引用 1 楼 xiaoguangzaia 的回复:
能不能说仔细点,”输入操作的时候都系统强制停止运行了“是什么情况,单步执行下错误在哪呢
我运行了下main函数中for循环前都可以运行(建立链表,输出链表)
创建链表和删除数据都可以,但是增加数据的时候就会停止了,你试的添加数据也可以吗?
[/Quote]
你两个地方错了,一个是swithc里面case 1/2/3/4不要带带引号。
另外在inster函数里面list *q = new list; 不然q没有分配空间直接赋值肯定不对
penline 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
C/C++ code

#include <iostream>
#include <string.h>
#include <windows.h>

using namespace std;

typedef long DataType; //可以是其他数据类型

//定义学生单链表结构体
typedef struct node
{
DataType data;//……
[/Quote]谢谢~
penline 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaoguangzaia 的回复:]
能不能说仔细点,”输入操作的时候都系统强制停止运行了“是什么情况,单步执行下错误在哪呢
我运行了下main函数中for循环前都可以运行(建立链表,输出链表)
[/Quote] 创建链表和删除数据都可以,但是增加数据的时候就会停止了,你试的添加数据也可以吗?
無_1024 2011-05-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <string.h>
#include <windows.h>

using namespace std;

typedef long DataType; //可以是其他数据类型

//定义学生单链表结构体
typedef struct node
{
DataType data;//学生学号
char name[20];//学生姓名
double score;//学生成绩分数
struct node* Next;//指向下一个学生的指针
}LinkList,*PLinkList;

/* ****************创建空单链表***********************/
PLinkList Create_Linklist()
{
PLinkList PLinkListPoint;
PLinkListPoint=new LinkList;//为PLinkList分配一个LinkList的空间
if(!PLinkListPoint)
{
cout<<"分配内存失败!"<<endl;
return (NULL);
}
else
{
PLinkListPoint->Next=NULL;
return (PLinkListPoint);//返回创建节点信息
}
}
/* ****************头插法创建并填充链表****************/
PLinkList Create_ReverseLinkList()
{
PLinkList H,preview;
int NodeCount=0;
H=new LinkList;
if(!H)
{
cout<<"分配内存失败!"<<endl;
return (NULL);
}
else
{
H->Next=NULL;
}
cout<<"\t请输入你想创建链表结点总数:";
cin>>NodeCount;
cout<<"\t\t请输入各结点数据\n\t(注:头插法创建,链表存储数据将与实际数据相反)";

for(int i=1;i<=NodeCount;i++)
{
cout<<endl;
preview=new LinkList;
cout<<"输入学号: ";
cin>>preview->data;
cout<<"输入姓名: ";
cin>>preview->name;
cout<<"输入分数: ";
cin>>preview->score;
preview->Next=H->Next;
H->Next=preview;
}
return (H);
}
// ****************尾插法创建并填充链表****************/
PLinkList Create_SeqLinkList()
{
PLinkList H,preview,current;
int NodeCount=0;
H=new LinkList;//申请一个LinkList的头结点
if(!H)
{
cout<<"分配内存失败!"<<endl;
return (NULL);
}
else
H->Next=NULL;
cout<<"\t请输入你想创建链表结点总数:";
cin>>NodeCount;
cout<<"\t\t请输入各结点数据\n\t(注:尾插法创建,链表顺序与实际数据相同)";
preview=H; //将H赋给preview
for(int i=1;i<=NodeCount;i++)
{
cout<<endl;
current=new LinkList;
if(!current)
{
cout<<"分配空间失败!"<<endl;
return (NULL);
}
preview->Next=current;
cout<<"输入学号:";
cin>>current->data;
cout<<"输入姓名:";
cin>>current->name;
cout<<"输入分数:";
cin>>current->score;
current->Next=NULL; //尾为节点指向空
preview=current;
}
return (H);
}

// ****************销毁链表操作****************************/
int Destory_LinkList(PLinkList* PLinkListPoint)
{
if(!*PLinkListPoint)
{
cout<<"表不存在!"<<endl;
return (0);
}
PLinkList p=*PLinkListPoint,q;
while(p)
{
q=p;
p=p->Next;
delete q;
}
return (1);
}
/*******************更新单链表*******************************/
int alter_LinkList(PLinkList PLinkListPoint, DataType DataX,float Grade)
{
PLinkList p=PLinkListPoint;
if(!PLinkListPoint)
{
cout<<"表不存在!"<<endl;
return (-1);
}
if(p)
{
while(p && p->data!=DataX)
p=p->Next;
if(!p)
{
cout<<"\n\n\n\n\t\t此表中,没有该数据!"<<endl;
return (NULL);
}
p->score=Grade;//将grade赋值给相应学号的成绩
return 1;
}
else
{
cout<<"表不存在!"<<endl;
return (0);
}
}
/**************删除指定值的学生的信息********************/
int Del_LinkList(PLinkList PLinkListPoint, DataType DataX)
{
//返回值:-1表不存在,1成功
PLinkList p=PLinkListPoint->Next;
PLinkList q,r;
r=PLinkListPoint;
if(!PLinkListPoint)
{
cout<<"表不存在!"<<endl;
return (-1);
}
if(p)
{
while(p && p->data!=DataX)
{
p=p->Next;
r=r->Next;//用于找到值相等的上一个节点
}
if(!p)
{
cout<<"\n\n\n\n\t\t此表中,没有该数据!"<<endl;
return (NULL);
}
q=p;
r->Next=q->Next;
delete q;
return (NULL);

}
else
{
cout<<"表不存在!"<<endl;
return (0);
}

}
/************************按元素检索操作**********************/
PLinkList Locate_LinkList(PLinkList PLinkListPoint ,DataType DataX)
{
PLinkList p=PLinkListPoint;
if(p)
{
while(p && p->data!=DataX)
p=p->Next;
if(p)
return(p);
else
{
cout<<"\n\n\n\n\t\t此表中,没有该数据!"<<endl;
return (NULL);
}

}
else
{
cout<<"表不存在!"<<endl;
return (NULL);
}
}
/********************逆置操作****************************/
PLinkList Reverse_LinkList(PLinkList PLinkListPoint)
{
if(!PLinkListPoint)
{
return (NULL);
}
PLinkList p,q;
p=PLinkListPoint->Next;
PLinkListPoint->Next=NULL;
while(p)
{
q=p;
p=p->Next;
q->Next=PLinkListPoint->Next;
PLinkListPoint->Next=q;
}
return (PLinkListPoint);
}
/*******************检查单链表是否为空******************/
int CheckEmpty_LinkList(PLinkList PLinkListPoint)
{
if(!PLinkListPoint)
return (-1);
if(!PLinkListPoint->Next)
return (1);
else
return (0);
}
/******************** 输出链表操作******************/
void Print_LinkListData(PLinkList H)
{
if(!H)
{
cout<<"链表不存在!"<<endl;
}
PLinkList current=H;
cout<<"操作后的单链表为:"<<endl;
cout<<"学 号\t\t姓 名\t\t成 绩 "<<endl;
cout<<endl;
current=current->Next;
while(current)
{
cout<<current->data<<"\t\t"<<current->name<<"\t\t"<<current->score<<endl;;
cout<<endl;
current=current->Next;
}
cout<<endl;
system("pause");
}

int main()
{
int i=-1,j=-1,choice;
long data=0,number;
float grade;
PLinkList PLinkListPoint1,PLinkListPoint2;
PLinkListPoint1=Create_Linklist();
while(1)
{
system("cls");
cout<<" **单链表操作及其实现(注意必须先选择操作 1 或者 2 建立单链表)**"<<endl;
cout<<"\t┏———————-—M E N U————————-┓ \n";
cout<<"\t│ │"<<endl;
cout<<"\t│ 1.头插法创建并填充链表 │"<<endl;
cout<<"\t│ 2.尾插法创建并填充链表 │"<<endl;
cout<<"\t│ 3.按元素检索操作 │"<<endl;
cout<<"\t│ 4.按学号删除结点操作 │"<<endl;
cout<<"\t│ 5.修改指定学号学生的成绩 │"<<endl;
cout<<"\t│ 6.逆置链表操作 │"<<endl;
cout<<"\t│ 7.销毁链表操作 │"<<endl;
cout<<"\t│ 0.退出程序 │"<<endl;
cout<<"\t│ │"<<endl;
cout<<"\t┗—————-请输入你想要实现的操作:-————-┛"<<endl;
cout<<"\t\t\t\t";
//cout<<"请输入你想要实现的操作: ";
cin>>choice;
system("cls");
switch(choice)
{
case 1:
case 2:
if(choice==1)
{
cout<<"\n\n\t\t\t1.头插法创建并填充链表"<<endl<<endl;
PLinkListPoint1=Create_ReverseLinkList();
Print_LinkListData(PLinkListPoint1);
break;
}
else
{
cout<<"\n\n\t\t\t2.尾插法创建并填充链表"<<endl<<endl;
PLinkListPoint1=Create_SeqLinkList();
Print_LinkListData(PLinkListPoint1);
break;
}
case 3:
if(CheckEmpty_LinkList(PLinkListPoint1))
{
cout<<"\n\n\t\t\t链表为空,请选择操作1、2建立单链表"<<endl;
system("pause");
break;
}
cout<<"\n\n\t\t\t3.按元素检索操作"<<endl<<endl;
cout<<"请输入你要查找学生的学号: ";
cin>>j;
PLinkListPoint2=Locate_LinkList(PLinkListPoint1,j);
if(PLinkListPoint2)
{
cout<<"要查找的元素为: "<<PLinkListPoint2->data<<"\t";
cout<<PLinkListPoint2->name<<"\t";
cout<<PLinkListPoint2->score<<endl;
}
j=-1;
system("pause");
break;
case 4:
if(CheckEmpty_LinkList(PLinkListPoint1))
{
cout<<"\n\n\t\t\t链表为空,请选择操作1、2建立单链表"<<endl<<endl;
system("pause");
break;
}
cout<<"\n\n\t\t\t4.按位置删除结点操作"<<endl<<endl;
cout<<"请输入你想删除学生的学号:";
cin>>i;
if(Del_LinkList(PLinkListPoint1 , i)==1)
{
cout<<"删除成功!"<<endl;
}
i=-1;
Print_LinkListData(PLinkListPoint1);
//system("pause");
break;
case 5:
if(CheckEmpty_LinkList(PLinkListPoint1))
{
cout<<"\n\n\t\t\t链表为空,请选择操作1、2建立单链表"<<endl;
system("pause");
break;
}
cout<<"\n\n\t\t\t5.修改指定学号学生的成绩"<<endl<<endl;
cout<<"请输入要修改的学生的学号和成绩: ";
cin>>number>>grade;
alter_LinkList(PLinkListPoint1,number,grade);
Print_LinkListData(PLinkListPoint1);
//system("pause");
break;
case 6:
if(CheckEmpty_LinkList(PLinkListPoint1))
{
cout<<"\n\n\t\t\t链表为空,请选择操作1、2建立单链表"<<endl;
system("pause");
break;
}
cout<<"\n\n\t\t\t6.逆置链表操作"<<endl<<endl;
Reverse_LinkList(PLinkListPoint1);
cout<<"\t\t\t逆置链表成功 !"<<endl;
Print_LinkListData(PLinkListPoint1);
//system("pause");
break;
case 7:
if(CheckEmpty_LinkList(PLinkListPoint1))
{
cout<<"\n\n\t\t\t链表为空,请选择操作1、2建立单链表"<<endl<<endl;
system("pause");
break;
}
cout<<"\n\n\t\t\t7.销毁链表操作"<<endl<<endl;
if(Destory_LinkList(&PLinkListPoint1))
{
cout<<"\n\n\t\t\t销毁单链表成功!"<<endl;
}
system("pause");
break;
//退出程序
case 0:
exit(0);
break;
default:
cout<<"\n\n\t\t\t输入参数错误!"<<endl;
system("pause");
break;
}
}
return 0;
}
//给你一个我以前写的吧
xiaoguangzaia 2011-05-04
  • 打赏
  • 举报
回复
能不能说仔细点,”输入操作的时候都系统强制停止运行了“是什么情况,单步执行下错误在哪呢
我运行了下main函数中for循环前都可以运行(建立链表,输出链表)

64,682

社区成员

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

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