m0_74219830 2023-04-09 13:19 采纳率: 0%
浏览 13

关于#c++#的问题:单链表基本操作多级菜单 运行后点第二个菜单(求表的合并和交并集)的时候没有反应

运行后点第二个菜单(求表的合并和交并集)的时候没有反应


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

//结点的定义
typedef int ElemType;
typedef struct Node 
{
    ElemType data;
    struct Node *next;
}Node,*LinkList;

//初始化:建立空表
void InitLinkList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
}

//创建非空单链表:头部插入法
void CreateFromHead(LinkList L)
{
    Node *s;
    ElemType v;
    int flag=1;
    printf("输入表中数据,输入-100结束!\n");
    while(flag)
    {
        scanf("%d",&v);
        if(v!=-100)
        {
            s=(Node*)malloc(sizeof(Node));
            s->data=v;
            s->next=L->next;
            L->next=s;
        }
        else {flag=0;}
        
    }
}

//内容查找:查找单链表中元素值为e的结点,并返回该结点地址
LinkList LocateLinkElem(LinkList L,ElemType e)
{
    Node*p;
    p=L->next;
    while(p!=NULL&&p->data!=e)p=p->next;
    return p;
}
//位置查找:查找单链表中第i个元素
LinkList GetLinkElem(LinkList L,int i)
{
    Node*p;
    int k;
    p=L->next;
    k=1;
    while(p!=NULL&&k<i)
    {
        p=p->next;
        k++;
    }
    return p;
}
//插入:在位置i插入元素e
int InsertLinkList(LinkList L,int i,ElemType e)
{
    Node*s,*pre;
    int k;
    pre=L;k=0;
    while(pre!=NULL&&k<i-1)
    {
        pre=pre->next;
        k++;
    }
    if(pre==NULL) return 0;
    else
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=e;
        s->next=pre->next;
        pre->next=s;
        return 1;
    }
}
//删除:删除表L中的第i个结点
int DeleteLinkList(LinkList L,int i,ElemType*e)
{
    Node*s,*pre;
    int k;
    pre=L;k=0;
    while(pre!=NULL&&k<i-1)
    {
        pre=pre->next;
        k++;
    }
    if(pre==NULL) return 0;
    s=pre->next;
    *e=s->data;
    pre->next=s->next;
    free(s);
    return 1;
}
//合并:合并两个有序的单链表
LinkList MergeLinkList(LinkList LA,LinkList LB,LinkList LC)
{
    Node*pa,*pb,*r;
    pa=LA->next;
    pb=LB->next;
    LC=LA;
    LC->next=NULL;r=LC;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->data<=pb->data)
        {r->next=pa;r=pa;pa=pa->next;}
        else
        {r->next=pb;r=pb;pb=pb->next;}
    }
    if(pa)
        r->next=pa;
    else
        r->next=pb;
    free(LB);
    return (LC);
}
//交集
LinkList Intersection(LinkList LA,LinkList LB,LinkList LC)
{
    Node*pa,*pb,*r;
    pa=LA->next;
    pb=LB->next;
    LC=LA;
    LC->next=NULL;r=LC;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->data==pb->data){
            r->next=pa;r=pa;pa=pa->next;
        }
    }
    return (LC);
}
//并集
LinkList Union(LinkList LA,LinkList LB,LinkList LC)
{
    Node*pa,*pb,*r;
    pa=LA->next;
    pb=LB->next;
    LC=LA;
    LC->next=NULL;r=LC;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->data<pb->data)
        {r->next=pa;r=pa;pa=pa->next;}
        else if(pa->data=pb->data)
        {r->next=pb;r=pb;pb=pb->next;}
    }
    if(pa)
        r->next=pa;
    else
        r->next=pb;
    free(LB);
    return (LC);
}
//输出单链表:输出每个结点的数据域的值
void OutPutLinkList(LinkList L)
{
    Node *p;
    p=L->next;//p指向首元结点
    printf("L->");
    while(p)//while(p!=NULL)
    {
        printf("%d->",p->data);
        p=p->next;
    }
    printf("NULL\n");
}

void menu1()
{
    system("cls");
    LinkList L;//变量的定义
    InitLinkList(&L);//变量的值的获取(初始值)
    CreateFromHead(L);    //变量的处理
    OutPutLinkList(L);    //变量的输出
    int choice;
    int i;
    ElemType e;
    while(1)
    {
        printf(" 1.插入\n");
        printf(" 2.删除\n");
        printf(" 3.查找\n");
        printf(" 0.退出 \n");
        printf(" 请选择0——3:");
        
        scanf("%d",&choice);
        if(choice==0)break;
        switch(choice)
        {
        case 1:
            printf("\n插入");
            printf("输入需插入的结点位置i和插入的元素值:");
            scanf("%d%d",&i,&e);
            if(InsertLinkList(L,i,e))OutPutLinkList(L);
            else printf("插入不成功!\n");break;
        case 2:
            printf("\n删除");
            printf("输入被删除结点的序号i:");
            scanf("%d",&i);
            if(DeleteLinkList(L,i,&e)){
                printf("被删除元素为%d\n",e);
                OutPutLinkList(L);
            }else printf("删除不成功!\n");
            break;
        case 3:int choice1;
            system("cls");
            while(1)
            {   
                printf("31 按位置查找\n");
                printf("32 按内容查找\n");
                printf("0 退出\n");
                printf("请选择...\n");
                scanf("%d",&choice1);
                if(choice1==0)break;
                switch(choice1)
                {
                case 31:
                    printf("输入查找位置i:");
                    scanf("%d",&i);
                    GetLinkElem(L,i);
                    if(GetLinkElem(L,i)!=NULL)printf("该位置元素为%d\n");
                    else printf("该位置没有元素!\n");break;
                case 32:
                    printf("\n查找");
                    printf("输入要查找的元素值:");
                    scanf("%d",&e);
                    LocateLinkElem(L,e);
                    if(LocateLinkElem(L,e)==0)printf("查找失败!\n");
                    else printf("查找成功,该元素是表中第%d个元素",e);
                    break;
                default:printf("选择错误,请重新选择!\n"); break;
                }
                    getch(); 
                system("cls");
            }
            break;
        default:printf("选择错误!请重新选择!\n");
        }
        getch();
        system("cls");
        
    }
     getch();
}

void menu2()
{
    
    system("cls");
    LinkList LA,LB,LC;//变量的定义
    int choice;
    int i;
    ElemType e;
    InitLinkList(&LA);
    InitLinkList(&LB);
    printf("输入表LA数据:\n") ;
    CreateFromHead(LA);
    printf("输入表LB数据:\n") ;
    CreateFromHead(LB);
    printf("LA:  "); 
    OutPutLinkList(LA);
    printf("LB:  ");
    OutPutLinkList(LB);
    
    while(1)
    {
        
        printf("1 两个有序表的合并\n");
        printf("2 两个集合的交\n");
        printf("3 两个集合的并\n");
        printf("0 退出\n");
        printf("请选择......\n");
        scanf("%d",&choice) ;
        if(choice==0 )break;
        switch(choice)
        {
            case 1: MergeLinkList(LA,LB,LC);printf("合并后的表LC:  ");OutPutLinkList(LC);break;
            case 2: Intersection(LA,LB,LC);OutPutLinkList(LC);break;
            case 3: Union(LA,LB,LC);OutPutLinkList(LC);break;
            default:printf("选择错误,请重新选择!\n");break;    
        }
        getch();
        system("cls");
    }
}

void menu()
{
    int choice;
    while(1)
    {
        printf("1 一个表的运算\n");
        printf("2 两个表的运算\n");
        printf("0 退出\n");
        printf("请选择......");
        scanf("%d",&choice);
        if(choice==0) break;
        switch(choice)
       {
        case 1: menu1();break;
        case 2: menu2();break;
           default:printf("选择错误!请重新选择。\n");
       }
        getchar();
        system("cls");
    }
}

int main()
{
    menu();
} 
```c++


```

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-09 16:15
    关注
    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7638746
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:二叉树应用之哈夫曼树、哈夫曼编码(C++实现)
    • 除此之外, 这篇博客: 数据结构 C++实现 基于不同策略的英文单词的词频统计和检索系统(糅合版)中的 二、设计内容 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 一篇英文文章存储在一个文本文件中,然后分别基于线性表、二叉排序树和哈希表不同的存储结构,完成单词词频的统计和单词的检索功能。同时计算不同检索策略下的平均查找长度ASL,通过比较ASL的大小,对不同检索策略的时间性能做出相应的比较分析(比较分析要写在实习报告中的“收获和体会”中)。

      1. 读取一篇包括标点符号的英文文章(InFile.txt),假设文件中单词的个数最多不超过5000个。从文件中读取单词,过滤掉所有的标点。
      2. 分别利用线性表(包括基于顺序表的顺序查找、基于链表的顺序查找、基于顺序表的折半查找)、二叉排序树和哈希表(包括基于开放地址法的哈希查找、基于链地址法的哈希查找)总计6种不同的检索策略构建单词的存储结构。
      3. 不论采取哪种检索策略,完成功能均相同。
        (1)词频统计
        当读取一个单词后,若该单词还未出现,则在适当的位置上添加该单词,将其词频计为1;若该单词已经出现过,则将其词频增加1。统计结束后,将所有单词及其频率按照词典顺序写入文本文件中。其中,不同的检索策略分别写入6个不同的文件。
        基于顺序表的顺序查找— OutFile1.txt
        基于链表的顺序查找— OutFile2.txt
        折半查找— OutFile3.txt
        基于二叉排序树的查找— OutFile4.txt
        基于开放地址法的哈希查找— OutFile5.txt
        基于链地址法的哈希查找— OutFile6.txt
        注:如果实现方法正确,6个文件的内容应该是一致的。
        (2)单词检索
        输入一个单词,如果查找成功,则输出该单词对应的频率,同时输出查找成功的平均查找长度ASL和输出查找所花费的时间。如果查找失败,则输出“查找失败”的提示。
    • 您还可以看一下 夏曹俊老师的C++ 设计模式原理与实战大全-架构师需备课程课程中的 模板方法的定义场景与实现:将“动作”封装成对象是理解行为型模式的重要基础小节, 巩固相关知识点
    评论

报告相同问题?

问题事件

  • 创建了问题 4月9日

悬赏问题

  • ¥15 传染病最优控制问题,控制为什么没起作用
  • ¥15 请问一个软件连接不上服务器了怎么办呀
  • ¥15 ue5.3 pico打包失败 求帮助
  • ¥15 请教,这是用chatgpt写的CAD LISPD脚本,需求是画一个由双直线组成的矩形
  • ¥50 微信小程序 成功包奶茶啊
  • ¥15 计算机博弈的六子棋代码
  • ¥15 在Fetch API中传送的参数为何不起作用?
  • ¥15 问题遇到的现象和发生背景 360导航页面千次ip是20元,但是我们是刷量的 超过100ip就不算量了,假量超过100就不算了 这是什么逻辑呢 有没有人能懂的 1000元红包感谢费
  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间