数据结构 单链表排序出错,其他都正常,用if写的

#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