m0_64901534 2022-11-06 23:43 采纳率: 77.3%
浏览 10
已结题

程序设计代码有函数逻辑错误,后面无法自动结束

问题遇到的现象和发生背景

项目有逻辑错误,无法正常结束

用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

想要修改后正确的代码

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>
struct Student
{
    int no;            //学号
    char name[10];     //姓名
    char sex;          //性别
    int age;           //年龄
    char major[12];    //专业
};
typedef struct Student ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node, *LinkList;

void copy(struct Student &s1,struct Student s2)
{
    s1.no=s2.no;
    strcpy(s1.name,s2.name);
    s1.sex=s2.sex;
    s1.age=s2.age;
    strcpy(s1.major,s2.major);
}


void CreateList_L(LinkList &L, ElemType A[], int n ) 
{
      // 已知一维数组A[n]中存有线性表的数据元素,创建单链线性表L
      LinkList s;
      L=new Node;
      L->next = NULL;                   // 先建立一个空的单链表
      for (int i = n-1; i >=0; i-- ) {
        s = new Node;            // 生成新结点
        copy(s->data,A[i]);      //s->data = A[i];           // 赋元素值
        s->next = L->next;    L->next = s;    // 插入在第一个结点之前
      }
}

void Show_L(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.sex<<" "<<p->data.age<<" "<<p->data.major<<endl;
        p=p->next;
    }
    cout<<endl;
}

int ListLength_L( LinkList L ) 
{
      // L 为链表的头指针,本函数返回 L 所指链表的长度
      LinkList p=L->next; int k=0;
      while ( p ) {
        k++;  p=p->next;   // k 计非空结点数
      }
      return k;
} 


int LocateElem_L( LinkList L,ElemType e ) 
{
      LinkList p=L->next;
      int index=1;
      while ( p && p->data.no != e.no )  
      {
          p=p->next;
          index++;
      }
      if(p) return index;
      else return 0;
} 

LinkList GetElem_L( LinkList L,ElemType e ) 
{
      LinkList p=L->next;
      while ( p && p->data.no != e.no )  
          p=p->next;
      return p;
} 

void ListInsert_L(LinkList L,int i,ElemType e)
{
    LinkList p=L,s; 
    int j=0;
    while (p && j<i-1)  //找到第i-1个结点的位置
    {
        p=p->next;
        j++;
    }
    if (!p)  {cout<<"插入位置非法"; exit(1);}
    else { 
        s=new Node;          //生成元素值为item的新结点s
        copy(s->data,e);      //s->data=e;  
        s->next=p->next;     //用后插法将s插入到结点p的后面
        p->next=s;
    }
}

void ListDelete_L(LinkList L,int i)
{
    LinkList p=L,q ; 
    int j=0;  
    while (p && j<i-1)  //查找第i-1个结点
    {
        p=p->next;
        j++;
    }
    if (!p || !p->next)  {cout<<"删除位置非法"; exit(1);}
    else 
    {
        q=p->next; 
        p->next=q->next;  
        delete q; 
    }
}


void DestroyList_L(LinkList &L)
{
    LinkList p=L,q;
    while(p)
    {
        q=p;
        p=p->next;
        delete q;
    }
    L=NULL;
}


void Create(LinkList &L)
{
    int n;
    struct Student st[100];
    cout<<"请输入学生人数:";
    cin>>n;
    cout<<"请输入每位学生的信息:";
    for(int i=0;i<n;i++)
        cin>>st[i].no>>st[i].name>>st[i].sex>>st[i].age>>st[i].major;
    CreateList_L(L,st,n);
    cout<<"学生信息如下:\n";
    Show_L(L);
}

void Locate(LinkList L)
{
    struct Student s;
    cout<<"请输入需查询学生的学号:";
    cin>>s.no;
    LinkList p=GetElem_L(L, s);
    if(p==NULL)
        cout<<"没有此学号的学生\n";
    else
        cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.sex<<" "<<p->data.age<<" "<<p->data.major<<endl;
}

void Delete(LinkList &L)
{
    struct Student s;    
    cout<<"请输入需删除学生的学号:";
    cin>>s.no;
    int index=LocateElem_L(L, s);
    if(index==0)
        cout<<"没有此学号的学生\n";
    else
    {
        ListDelete_L(L, index);
        Show_L(L);
    }
}

void Insert(LinkList &L)
{
    struct Student s;
    cout<<"请输入需插入学生的学号:";
    cin>>s.no;
    cout<<"请输入需插入学生的姓名:";
    cin>>s.name;
    cout<<"请输入需插入学生的性别:";
    cin>>s.sex;
    cout<<"请输入需插入学生的年龄:";
    cin>>s.age;
    cout<<"请输入需插入学生的专业:";
    cin>>s.major;
    int len=ListLength_L(L);
    ListInsert_L(L, len+1, s );
    cout<<"学生信息如下:\n";
    Show_L(L);
}

void Exit(LinkList &L)
{
    if(L!=NULL)
        DestroyList_L(L);
}

int main()
{
    LinkList List=NULL;    
    int choice=0;
    do
    {
        cout<<"****************学生信息管理***************\n";
        cout<<"******************1----建立****************\n";
        cout<<"******************2----查询****************\n";
        cout<<"******************3----删除****************\n";
        cout<<"******************4----增加****************\n";
        cout<<"******************0----退出****************\n";
        cout<<"*******************************************\n";
        cout<<"请选择(0-4):";
        cin>>choice;
        switch(choice)
        {
        case 1:
            {
                Create(List);
                break;
            }
        case 2:
            {
                Locate(List);
                break;
            }
        case 3:
            {
                Delete(List);
                break;
            }
        case 4:
            { 
                Insert(List);
                break;
            }
        case 0:
            {
                Exit(List);
                break;
            }
        default:
            cout<<"输入错误!\n"<<endl;
        }
    }while(choice);
    return 0;
}
    
    
    
    
    

img

img

  • 写回答

1条回答 默认 最新

  • 浪客 2022-11-07 00:21
    关注

    LinkList p = L->next; 前面判断一下L是否为空。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 修改了问题 11月7日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 关于#hyperledger#的问题,如何解决?
  • ¥30 使用opencv中的solvePnPRansac计算相机位姿后,误差较大
  • ¥15 串口控制LED灯驱动板设计
  • ¥15 如何在unity场景里做到通过按钮实现模型替换
  • ¥15 uniapp的websocket和c++的websocket服务器通讯 发送的数据和接受的数据表现形式不一样
  • ¥15 pyspark配置中的错误
  • ¥15 html word表格
  • ¥15 kali安装包如何解决,请给明确方案和步骤
  • ¥15 DEA软件进行企业创新效率的计算
  • ¥15 树莓派驱动42步进电机