![]() |
#2
书生牛犊2016-09-23 19:01
typedef struct node{ 这是个蛮奇葩的用法。int num; char name[20]; int sum; }vote[N+1]; 这里声明了一种数据类型vote ,是机构体数组 struct node[N+1];//N还是N+1,其实待会都是错的 ![]() p=(vote*)malloc(sizeof(vote));//指针p指向了一个数组,数组大小神马的你先别在意 上个测试代码,输出这些变量的地址给你看,希望你能醒悟,这种稀奇古怪的typedef,以后还是少用为好。cout<<"请输入选手的数量:"; cin>>n; number=n; cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl; while (n--) { cin>>p[i]->num>>p[i]->name;//p[i]是神马?p[i]能等于struct node[i]吗?很显然,不能!p[i]也就是p[1]此刻的地址等于p+sizeof(vote); i++; } ![]() #include <iostream> #include <stdio.h> #include<malloc.h> #define N 9 using namespace std; typedef struct node { int num; char name[20]; int sum; } vote[N+1]; vote *p; int number; void xs() { int i=1; int n; p=(vote*)malloc(sizeof(vote)); printf("p=%d\n",p); printf(",sizeof()=%d\n",sizeof(vote)); n=1; // cout<<"请输入选手的数量:"; // cin>>n; // number=n; // cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl; while (n--) { printf("p[i]=%d\n",&p[i]); // cin>>p[i]->num>>p[i]->name; i++; } cout<<"选手信息如下:"<<endl; cout<<" 编号 姓名"<<endl; for(i=1; i<=number; i++) { cout<<p[i]->num<<" "<<p[i]->name<<endl; } } void toupiao() { int i,n; for( i=1; i<=number; i++) { p[i]->sum=0; } cout<<"请观众通过按键进行投票,按'1'对1号选手投票,按'2'对2号选手投票,以此类推,以按'0'作为投票结束标志"<<endl; while (1) { cin>>n; if (n==0) break; while(n<1||n>number) { cout<<"不存在此选手,请重新输入:"; cin>>n; } p[n]->sum ++; } cout<<"投票完成!"<<endl; } void shellsort(vote *R,int n ) { int i,j,d; for (d=n/2; d>=1; d=d/2) { for (i=d+1; i<=n; i++) { *R[0]=*R[i]; for(j=i-d; j>0&&R[j]->sum>R[0]->sum; j=j-d) *R[j+d]=*R[j]; *R[j+d]=*R[0]; } } } int main() { int n,i; while(1) { cout<<"1.输入选手信息"<<endl; cout<<"2.观众投票"<<endl; cout<<"3.比赛结果"<<endl; cout<<"0.退出"<<endl; cout<<"请输入你要选择的操作序号,按回车键确认:"<<endl; cin>>n; switch (n) { case 1: xs(); break; case 2: toupiao(); cout<<"编号 姓名 票数 "<<endl; for( i=1; i<=number; i++) { cout<<p[i]->num<<" "<<p[i]->name<<" "<<p[i]->sum<<endl; } break; case 3: shellsort(p,number); int t=1; cout<<"名次 姓名 票数 "<<endl; for( i=number; i>=1;) { for(int e=i; p[e]->sum==p[e-1]->sum; e--) { cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl; } // cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl; // t++; // i=e-1; } } } return 0; } 只有本站会员才能查看附件,请 登录 如果你有兴趣的话,可以修改一下n的值,多输出几个p[i]地址。 #define N 9,这件事情在编译的时候就替换掉了,在程序生成以前那个地方就变成了node[9+1]也就是node[10]了,是常数,不是导致这个程序有问题的根源。 typedef <类型名> 某种数据结构数组 这个用法通常是在嵌套for(auto k:a){for(auto u:k){...}}里面的第一个auto就应该是结构体数组类型,而第二个auto是是结构体类型。 你的程序要改的话,就得把p的类型改成struct node* 到我本人并不推荐这样的用法。因为sizeof(vote)本身其实就是等于sizeof(struct node)*(N+1)//或者N吧,反正不重要。 当用户输入的n大于等于你所define的N的时候,你的程序还是会出现指针越界的问题还是个废物。。。 malloc是个动态申请函数,既然如此何不直接malloc(sizeof(struct node)*n);//n来自用户输入的选手数量。 |
#include <iostream>
#include <stdio.h>
#include<malloc.h>
#define N 9
using namespace std;
typedef struct node{
int num;
char name[20];
int sum;
}vote[N+1];
vote *p;
int number;
void xs(){
int i=1;
int n;
p=(vote*)malloc(sizeof(vote));
cout<<"请输入选手的数量:";
cin>>n;
number=n;
cout<<"请输入"<<n<<"名选手的编号和姓名:"<<endl;
while (n--)
{
cin>>p[i]->num>>p[i]->name;
i++;
}
cout<<"选手信息如下:"<<endl;
cout<<" 编号 姓名"<<endl;
for(i=1;i<=number;i++)
{
cout<<p[i]->num<<" "<<p[i]->name<<endl;
}
}
void toupiao()
{
int i,n;
for( i=1;i<=number;i++){
p[i]->sum=0;}
cout<<"请观众通过按键进行投票,按'1'对1号选手投票,按'2'对2号选手投票,以此类推,以按'0'作为投票结束标志"<<endl;
while (1)
{
cin>>n;
if (n==0) break;
while(n<1||n>number)
{cout<<"不存在此选手,请重新输入:";
cin>>n;}
p[n]->sum ++;
}
cout<<"投票完成!"<<endl;
}
void shellsort(vote *R,int n ){
int i,j,d;
for (d=n/2;d>=1;d=d/2){
for (i=d+1;i<=n;i++)
{
*R[0]=*R[i];
for(j=i-d;j>0&&R[j]->sum>R[0]->sum;j=j-d)
*R[j+d]=*R[j];
*R[j+d]=*R[0];
}
}
}
void main(){
int n,i;
while(1){
cout<<"1.输入选手信息"<<endl;
cout<<"2.观众投票"<<endl;
cout<<"3.比赛结果"<<endl;
cout<<"0.退出"<<endl;
cout<<"请输入你要选择的操作序号,按回车键确认:"<<endl;
cin>>n;
switch (n){
case 1:
xs();
break;
case 2:
toupiao();
cout<<"编号 姓名 票数 "<<endl;
for( i=1;i<=number;i++){
cout<<p[i]->num<<" "<<p[i]->name<<" "<<p[i]->sum<<endl;}
break;
case 3:
shellsort(p,number);
int t=1;
cout<<"名次 姓名 票数 "<<endl;
for( i=number;i>=1;){
for(int e=i;p[e]->sum==p[e-1]->sum;e--){
cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;}
cout<<t<<" "<<p[e]->name<<" "<<p[e]->sum<<endl;
t++;i=e-1;}
}
}
}
如果结构体中N+1改为N,那就出现下面这张情况,为什么
只有本站会员才能查看附件,请 登录