qq_15029585
qq_15029585
采纳率100%
2021-04-01 20:00

数据结构 单链表排序出错,其他都正常,用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;
        }
    }
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • qq_43414873 小白小白你好菜 1月前

    完整代码如下:(只修改了你的排序函数)

    #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;
            }
        }
    }
    点赞 1 评论 复制链接分享
  • qq_43414873 小白小白你好菜 1月前

    我仔细看了一下你的代码,如果我没理解错的话,你应该是选择排序,而且是从小到大排序。

    你写错的是223行和224行,我觉得你可能是不小心写错了,但是自己没有检查出来。

    你的s = q,q都没有指向任何变量怎么会有值呢?你的s应该等于p,当第一次循环结束,跟随p用第二个数据去跟后面的比较并记录地址。q应该等于p->next即本次循环的第二个位置,如果s和q是同一个位置,就没有比较的必要了。。。

    还有就是,题主去看看微软的C语言格式规范吧,答主看代码看的心里发麻,上面的代码是整理后的格式。无误请点采纳!

    点赞 1 评论 复制链接分享
  • QA_Assistant 有问必答小助手 1月前

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论 复制链接分享

相关推荐