关于C语言的结构体中元素的筛选,排列顺序。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言的结构体中元素的筛选,排列顺序。相关的知识,希望对你有一定的参考价值。

这是我写的一个程序。先定义了一个结构体person,结构体类型数组per和结构体类型指针,p,q。我是想从结构体数组中,按照字母顺序,从小到大的,把姓名排列,并且输出。我是一个初学者啊,希望高手能帮我看看,我的这个程序怎么出错了,应该怎么改正。谢谢大家了~~~
#include "stdafx.h"
#include "string"
void main()

struct person

char name[20];
char sex;
int age;
float height;
per[7]="Li Ping",'M',22,178.2,"Gao Ming",'F',23,171.5,"Zhao Er",'F',32,168.6,"Wang Ying",'F',20,158.9,"Zhang Xiao",'M',25,181.0,"Deng Tao",'M',27,177.6,"Hao San",'F',22,175.7,;
struct person *p;
struct person *q;
q=p=per;
for(;p<per+7;p++)

if(strcmp(p->name,(p+1)->name)>0)

*q=*(p+1);
*(p+1)=*p;
*p=*q;

printf("name=%-18s,sex=%3c,age=%4d,height=%7.2f\n",p->name,p->sex,p->age,p->height);

参考技术A 错了两个地方,第一个错误是q的使用,因为q=per,所以每次*q=*(p+1);会导致把数组第一个改掉。第二个错误是冒泡只冒了一遍,应该用两层循环。
只要改一点点就好了,写注释的地方就是改动的地方。
#include "stdafx.h"
#include "string"
void main()

struct person

char name[20];
char sex;
int age;
float height;
per[7]="Li Ping",'M',22,178.2,"Gao Ming",'F',23,171.5,"Zhao Er",'F',32,168.6,"Wang Ying",'F',20,158.9,"Zhang Xiao",'M',25,181.0,"Deng Tao",'M',27,177.6,"Hao San",'F',22,175.7,;
struct person *p;
struct person q; //这行,去了*
for (int i = 0; i < 7; i++) //这行,新加的
for(p = per; p < per+7; p++) //这行,加了p=per

if(strcmp(p->name,(p+1)->name)>0)

q=*(p+1); //这行,去了*
*(p+1)=*p;
*p=q; //这行,去了*




//下面这几行,最后循环一次输出排序的结果
for(p = per; p < per+7; p++)
printf("name=%-18s,sex=%3c,age=%4d,height=%7.2f\n",p->name,p->sex,p->age,p->height);


本回答被提问者采纳
参考技术B 结构体在C中属于复杂类型,不能用一个"="就把全部内容赋给另一个变量。所以对结构体数组排序时最好是另建一个结构体型指针数组(如改过的代码中的*这[7]),指针是简单变量,按要求对这个指针数组进行排序就简单了……////////////后是有改动的,自己看,可续问。
#include "stdio.h"//
#include "string.h"//
void main(void)//
struct person
char name[20];
char sex;
int age;
float height;
per[7]="Li Ping",'M',22,178.2,
"Gao Ming",'F',23,171.5,
"Zhao Er",'F',32,168.6,
"Wang Ying",'F',20,158.9,
"Zhang Xiao",'M',25,181.0,
"Deng Tao",'M',27,177.6,
"Hao San",'F',22,175.7,;
struct person *p[7],*q;/////////////////////////////
int i,j;
for(i=0;i<7;i++)
p[i]=&per[i];
q=per;
for(i=0;i<6;i++)
for(j=i+1;j<7;j++)
if(strcmp(p[i]->name,p[j]->name)>0)
q=p[i];
p[i]=p[j];
p[j]=q;

printf("name=%-18s,sex=%3c,age=%4d,height=%7.2f\n",p[i]->name,p[i]->sex,p[i]->age,p[i]->height);

C语言结构体的内存分配

一、结构体内存分配原则 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。 原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最

以上是关于关于C语言的结构体中元素的筛选,排列顺序。的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体变量字节对齐问题总结

用c语言给结构体中的元素排序

用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

C语言,结构体中的数组怎么赋值,?

c语言怎么结构数据初始化?