MMbukua 2022-10-08 13:19 采纳率: 77.8%
浏览 15
已结题

输入与输出顺序不一致

问题遇到的现象和发生背景 数据结构遍历输出与输入元素顺序反了
用代码块功能插入代码,请勿粘贴截图
我的解答思路和尝试过的方法
我想要达到的结果 正过来与输入顺序一致
#include<iostream>
#include<fstream>
using namespace std; 
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100 
#define ERROR 0
#define OK 1
//定义链表 
typedef struct LNode{
    char data;
    struct LNode *next;
}LNode,*LinkList;

//单链表的初始化 
int  InitList(LinkList &L)
{
    //构造一个空的单链表l
    L=new LNode;//生成新结点作为头结点,用头指针L指向头结点
    L->next=NULL;//头结点的指针域置空
    return 1; 
}
int ListLength(LinkList L)
{
    LinkList p=L;int sum=0;
    while(p)
    {
     sum++;
     p=p->next;
    }
    return sum-1;//去除头结点
}

//初始化头插法
void GreateList_H(LinkList &L,int n)
{
    //逆位序输n个元素的值,建立带表头结点的单链表L

    L=new LNode;
    L->next=NULL;//先建立一个带头结点的空链表 
    LinkList p=L;
    printf("请依次输入单链表:");
    for(int i=0;i<n;++i)
    {
        p=new LNode;
        cin>>p->data;//输入元素值赋给新结点*p的数据域 
        p->next=L->next;
        L->next=p;
        
     } 
     
 } 
//遍历输出函数
void PrintList(LinkList L)
{
    LinkList p=L->next;//跳过头结点
    if(ListLength(L))
    {
        printf("当前单链表所有元素:");
        while(p)
        {
            printf("%c",p->data);
            p=p->next;
        }
        printf("\n");
    }
    else
    {
        printf("当前单链表已空");
    }
}
//插入 
int ListInsert(LinkList &L,int i,char e)
{
    //在带头结点的的单链表L中第i个位置插入值为e的新结点
    LinkList p=L;
    int j=0;
    LNode* s;
    while(p&&(j<i-1))
    {
        p=p->next;++j;//查找第i-1个结点,p指向该结点 
    } 
    if(!p||j>i-1)
    { 
    printf("插入位置无效");
    return 0;
    } 
    s=new LNode;//生成新结点*s 
    s->data=e;//将新结点的数据域置为e 
    s->next=p->next;//将结点*s的指针域指向结点ai 
    p->next=s;//将结点*p的指针域指向结点*s 
    return 1;
    
}
int ListDelete(LinkList &L,int i)
{
    //在带头结点的单链表L中,删除第i个元素
    LinkList p=L;int j=0;LNode* q;
    while((p->next)&&(j<i-1))
    {
        p=p->next;++j;//查找第i-1个结点,p指向该结点 
     } 
     if(!(p->next)||(j>i-1))
     {
        printf("删除位置无效!!!\n");
        return 0;
    }//当i>n或i<1,删除位置不合理
     q=p->next;//临时保存被删结点的地址以备释放 
     p->next=q->next;//改变删除结点前驱 
     delete q;//释放删除结点的空间 
     return 1; 
}
//主函数
int main()
{
 LinkList L;int choice;
 InitList(L);
 while(1)
 {
  printf("\t\t1.输入\n\n");
  printf("\t\t2.插入\n\n");
  printf("\t\t3.删除n\n");
  printf("\t\t4.输出\n\n");
  printf("\t\t5.退出\n\n");
  printf("\n\n\n\t请输入菜单序号:");
  scanf("%d",&choice);
  if(choice==5) break;
  switch(choice)
  {
  case 1:
            int y;//y单链表的长度
                InitList(L);//创建单链表表
                printf("\n请输入单链表的长度:"); 
                scanf("%d",&y);
                GreateList_H(L,y);//依次输入单链表元素
                printf("遍历输出单链表:");
                PrintList(L);
                printf("\n\n"); 
                break;

  case 2:
        int place;char e;bool flag;
        printf("请输入要插入的位置(从1开始)及元素:\n");
        scanf("%d%c",&place,&e);
        flag=ListInsert(L,place,e);
        if(flag) 
        {
        printf("插入成功");
        PrintList(L);
        }break;
  case 3:
        int p;char s;
        printf("请输入要删除的位置(从1开始):\n");
        scanf("%d",&place);
        s=ListDelete(L,place);
        if(s) 
        {
        printf("删除成功");
         PrintList(L);
       }break;
  case 4:PrintList(L);break;
  default:printf("输入错误");
  }
 }
 return 0;
 }

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-10-08 13:29
    关注

    头插法就是反的啊,要正的就用尾插法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加