C➕➕基础 想问一下哪里有问题

img

img


真看不出来哪里有问题 有没有人可以帮忙解答一下 心态都不好啦 不知道说什么了 怎么还不够30个字

语言选择错了,你选的是C,要选C++

【相关推荐】



  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7792391
  • 这篇博客也不错, 你可以看下获取任意一张图像中,多个矩阵图形的质心及其像素面积
  • 您还可以看一下 郑光华老师的性能测试核心知识解惑课程中的 如何开展性能需求分析?小节, 巩固相关知识点
  • 除此之外, 这篇博客: 《算法与数据结构实践专题》 任务书及题目汇总【醒目】【业界良心】中的 13. 简单个人电话号码查询系统(二叉排序树) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    问题描述
    人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
    基本要求

    1. 在外存上,用文件保存电话号码信息;

    2. 在内存中,设计数据结构存储电话号码信息;

    3. 提供查询功能:根据姓名实现快速查询;

    4. 提供其他维护功能:例如插入、删除、修改等;

    5. 按电话号码进行排序。

    设计思想
    由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:

    const int max=10;
        struct TeleNumber
        {
           string name;   //姓名
           string phoneNumber;    //固定电话号码
           string mobileNumber;   //移动电话号码
           string email;   //电子邮箱
        } Tele[max];
    

    为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是,在数组中实现插入和删除操作的代价较高。如果记录需频繁进行插入或删除操作,可以考虑采用二叉排序树组织电话号码信息,则查找和维护都能获得较高的时间性能。更复杂地,需要考虑该二叉排序树是否平衡,如何使之达到平衡。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N=10000;
    
    #define lc a[p].l
    #define rc a[p].r
    
    struct BST{
    	int l,r;
    	int dat;
    	string name;
    	string phone; 
    }a[N];
    
    int tot,root,n;
    
    int New(string val,string na){
    	a[++tot].phone=val;
    	a[tot].name=na;
    	a[tot].dat=rand();//随机数据为了使二叉树尽量平衡 
    	return tot;
    }
    //初始化 
    void build(){
    	New(" "," ");New("99999999999"," ");
    	root=1,a[1].r=2;
    }
    
    //查找 
    int Get(int p,string val){
    	if(p==0) return 0;//检索失败 
    	if(val==a[p].phone) return p;//检索成功 
    	return val<a[p].phone?Get(lc,val):Get(rc,val);
    }
    
    //左旋 
    void zig(int &p){
    	int q=a[p].l;
    	a[p].l=a[q].r;a[q].r=p;
    	p=q;
    }
    //右旋 
    void zag(int &p){
    	int q=a[p].r;
    	a[p].r=a[q].l,a[q].l=p;
    	p=q;
    }
    //插入 
    void Insert(int & p,string val,string na){
    	if(p==0) { p=New(val,na);return;}
    	if(val==a[p].phone) return;
    	if(val<a[p].phone){
    		Insert(lc,val,na);
    		if(a[p].dat<a[lc].dat) zig(p);
    	}
    	else{
    		Insert(rc,val,na);
    		if(a[p].dat<a[rc].dat) zag(p);
    	}
    }
    //删除 
    void Remove(int &p,string val){
    	if(p==0) return;
    	if(val==a[p].phone){
    		if(lc||rc){
    			if(rc==0||a[lc].dat>a[rc].dat) zig(p),Remove(rc,val);
    			else zag(p),Remove(lc,val);
    		}
    		else p=0;
    		return;
    	}
    	val<a[p].phone?Remove(lc,val):Remove(rc,val);
    }
    
    //暴力查找名字 
    int GetByName(string na){
    	for(int i=1;i<=tot;i++){
    		if(na==a[i].name) {
    			return i;
    		}
    	}
    	return 0;
    }
    
    void menu(){
    	printf("1.插入电话信息与姓名\n");
    	printf("2.根据姓名查询\n");
    	printf("3.删除电话信息\n");
    	printf("4.修改电话信息\n"); 
    	printf("5.打印所有信息(按照电话排序)\n");
    	printf("0.退出\n"); 
    	printf("输入选择:"); 
    }
    
    void output(int p){
    	cout<<"姓名: "<<a[p].name<<"  联系电话: "<<a[p].phone<<endl; 
    }
    //先序遍历 
    void display(int p){
    	if(lc) display(lc);
    	output(p); 
    	if(rc) display(rc);
    }
    
    #undef lc
    #undef rc 
    
    void run(){
    	int ch;
    	do{
    		string na,phone,newphone;
    		menu();
    		cin>>ch;
    		switch(ch){
    			case 1:
    				printf("输入姓名 电话:");
    				cin>>na>>phone; 
    				Insert(root,phone,na);
    				break;
    			case 2:
    				printf("输入要查询姓名:");
    				cin>>na;
    				int x;
    				if((x=GetByName(na))==0) {
    					printf("不存在!\n"); 
    				}
    				else{
    					output(x);
    				}
    				break;
    			case 3:
    				printf("输入删除的电话:");
    				cin>>phone;
    				Remove(root,phone);	
    				break;
    			case 4:
    				printf("输入你要修改的手机号:");
    				cin>>phone;
    				printf("输入你要新的手机号:");
    				cin>>newphone;
    				if(Get(root,phone)==0){
    					printf("不存在!\n"); 
    				}
    				else{
    					Insert(root,newphone,a[Get(root,phone)].name);
    					Remove(root,phone); 
    				}
    				break;
    			case 5:display(root);
    				break;
    		}
    	}while(ch);
    }
    
    
    int main(){
    	run();
    	return 0;
    }
    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^