#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status Initlist(LinkList &L); //初始化
void ShowList(LinkList L); //输出
Status CreateList_H(LinkList &L,int n); //前插法创建单链表
Status CreateList_R(LinkList &L,int n); //后插法创建单链表
Status GetElem(LinkList L,int i,ElemType &e); //取值
LNode *LocateElem(LinkList L,ElemType e); //查找
Status Listlnsert(LinkList &L,int i,ElemType e); //插入
Status ListDelete(LinkList &L,int i); //删除
void SortList(LinkList &L); //排序
LinkList L;
ElemType o,e,i,t,j,n;
LNode *p,*r,*s,*q;
int main() //main
{
while(1)
{
cout<<"*********************************菜单*********************************"<<endl;
cout<<" 1.初始化并创建单链表表 2.取值 3.查找 4.插入 5.删除 6.输出 7.排序 0.退出"<<endl;
cout<<"**********************************************************************"<<endl;
cout<<"请选择操作:(0~7)";
cin>>o;
if(o==1)
{
if(CreateList_R(L,n))
cout<<"创建成功"<<endl;
else
cout<<"创建失败"<<endl;
system("pause");
system("cls");
}
if(o==6)
{
ShowList(L);
system("pause");
system("cls");
}
if(o==3)
{
cout<<"请输入查找的元素:"<<endl;
cin>>e;
cout<<LocateElem(L,e)<<endl;
system("pause");
system("cls");
}
if(o==2)
{
cout<<"请输入要取元素的位置:"<<endl;
cin>>i;
if(GetElem(L,i,e))
cout<<"取出成功"<<endl;
else
cout<<"取出失败"<<endl;
cout<<"您取的元素为:";
cout<<e<<endl;
system("pause");
system("cls");
}
if(o==4)
{
cout<<"请输入要插入的元素:"<<endl;
cin>>e;
cout<<"请输入插入元素的位置:"<<endl;
cin>>i;
if(Listlnsert(L,i,e))
cout<<"插入成功"<<endl;
else
cout<<"插入失败"<<endl;
system("pause");
system("cls");
}
if(o==5)
{
cout<<"请输入删除的元素的位置:"<<endl;
cin>>i;
if(ListDelete(L,i))
cout<<"删除成功"<<endl;
else
cout<<"删除失败"<<endl;
system("pause");
system("cls");
}
if(o==0)
{
cout<<"谢谢使用";
return 0;
system("pause");
system("cls");
}
if(o==7)
{
SortList(L);
cout<<"排序成功:"<<endl;
ShowList(L);
system("pause");
system("cls");
}
}
return 0;
}
Status CreateList_H(LinkList &L,int n) //前插法创建单链表
{
L=new LNode;
L->next=NULL;
cout<<"请输入元素个数:";
cin>>n;
cout<<"请依次输入元素:";
for(i=0;i<n;++i)
{
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
return OK;
}
Status CreateList_R(LinkList &L,int n) //后插法创建单链表
{
L=new LNode;
L->next=NULL;
r=L;
cout<<"请输入元素个数:";
cin>>n;
cout<<"请依次输入元素:";
for(i=0;i<n;++i)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
Status GetElem(LinkList L,int i,ElemType &e) //取值
{
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
LNode *LocateElem(LinkList L,ElemType e) //查找
{
p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
Status Listlnsert(LinkList &L,int i,ElemType e) //插入
{
p=L;
j=0;
while(p&&(j<i-1))
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList &L,int i) //删除
{
p=L;
j=0;
while((p->next)&&(j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1))
return ERROR;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
void ShowList(LinkList L) //输出
{
LNode *p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void SortList(LinkList &L) //排序
{
ElemType t;
LNode *p,*s,*q;
for(p=L->next;p->next!=NULL;p=p->next)
{
s=q;
p=p->next;
while(q!=NULL)
{
if(s->data>q->data)
s=q;
q=q->next;
}
if(p!=s)
{
t=s->data;
s->data=p->data;
p->data=t;
}
}
}
完整代码如下:(只修改了你的排序函数)
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status Initlist(LinkList &L); //初始化
void ShowList(LinkList L); //输出
Status CreateList_H(LinkList &L, int n); //前插法创建单链表
Status CreateList_R(LinkList &L, int n); //后插法创建单链表
Status GetElem(LinkList L, int i, ElemType &e); //取值
LNode *LocateElem(LinkList L, ElemType e); //查找
Status Listlnsert(LinkList &L, int i, ElemType e); //插入
Status ListDelete(LinkList &L, int i); //删除
void SortList(LinkList &L); //排序
LinkList L;
ElemType o, e, i, t, j, n;
LNode *p, *r, *s, *q;
int main() //main
{
while(1)
{
cout<<"*********************************菜单*********************************" << endl;
cout<<" 1.初始化并创建单链表表 2.取值 3.查找 4.插入 5.删除 6.输出 7.排序 0.退出" << endl;
cout<<"**********************************************************************" << endl;
cout<<"请选择操作:(0~7)";
cin >> o;
if(o == 1)
{
if(CreateList_R(L, n))
cout << "创建成功" << endl;
else
cout << "创建失败" << endl;
system("pause");
system("cls");
}
if(o == 6)
{
ShowList(L);
system("pause");
system("cls");
}
if(o == 3)
{
cout << "请输入查找的元素:" << endl;
cin >> e;
cout << LocateElem(L, e) << endl;
system("pause");
system("cls");
}
if(o == 2)
{
cout << "请输入要取元素的位置:" << endl;
cin >> i;
if(GetElem(L, i, e))
cout << "取出成功" << endl;
else
cout << "取出失败" << endl;
cout << "您取的元素为:";
cout << e << endl;
system("pause");
system("cls");
}
if(o == 4)
{
cout << "请输入要插入的元素:" << endl;
cin >> e;
cout << "请输入插入元素的位置:" << endl;
cin >> i;
if(Listlnsert(L, i, e))
cout << "插入成功" << endl;
else
cout << "插入失败" << endl;
system("pause");
system("cls");
}
if(o == 5)
{
cout << "请输入删除的元素的位置:" << endl;
cin >> i;
if(ListDelete(L, i))
cout << "删除成功" << endl;
else
cout << "删除失败" << endl;
system("pause");
system("cls");
}
if(o == 0)
{
cout << "谢谢使用";
return 0;
system("pause");
system("cls");
}
if(o == 7)
{
SortList(L);
cout<<"排序成功:"<<endl;
ShowList(L);
system("pause");
system("cls");
}
}
return 0;
}
Status CreateList_H(LinkList &L, int n) //前插法创建单链表
{
L = new LNode;
L->next = NULL;
cout << "请输入元素个数:";
cin >> n;
cout << "请依次输入元素:";
for(i = 0; i < n; ++i)
{
p = new LNode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
return OK;
}
Status CreateList_R(LinkList &L, int n) //后插法创建单链表
{
L = new LNode;
L->next = NULL;
r = L;
cout << "请输入元素个数:";
cin >> n;
cout << "请依次输入元素:";
for(i = 0; i < n; ++i)
{
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
return OK;
}
Status GetElem(LinkList L, int i, ElemType &e) //取值
{
p = L->next;
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
e = p->data;
return OK;
}
LNode *LocateElem(LinkList L, ElemType e) //查找
{
p = L->next;
while(p && p->data != e)
p = p->next;
return p;
}
Status Listlnsert(LinkList &L, int i, ElemType e) //插入
{
p = L;
j = 0;
while(p && (j<i-1))
{
p = p->next;
++j;
}
if(!p || j>i-1)
return ERROR;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList &L, int i) //删除
{
p = L;
j = 0;
while((p->next) && (j<i-1))
{
p = p->next;
++j;
}
if(!(p->next) || (j>i-1))
return ERROR;
q = p->next;
p->next = q->next;
delete q;
return OK;
}
void ShowList(LinkList L) //输出
{
LNode *p = L->next;
while(p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void SortList(LinkList &L) //排序
{
ElemType t;
LNode *p, *s, *q;
for(p = L->next; p->next != NULL; p = p->next)
{
s = p;
q = p->next;
while(q != NULL)
{
if(s->data > q->data)
s = q;
q = q->next;
}
if(p != s)
{
t = s->data;
s->data = p->data;
p->data = t;
}
}
}
我仔细看了一下你的代码,如果我没理解错的话,你应该是选择排序,而且是从小到大排序。
你写错的是223行和224行,我觉得你可能是不小心写错了,但是自己没有检查出来。
你的s = q,q都没有指向任何变量怎么会有值呢?你的s应该等于p,当第一次循环结束,跟随p用第二个数据去跟后面的比较并记录地址。q应该等于p->next即本次循环的第二个位置,如果s和q是同一个位置,就没有比较的必要了。。。
还有就是,题主去看看微软的C语言格式规范吧,答主看代码看的心里发麻,上面的代码是整理后的格式。无误请点采纳!
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632