Ⅰ c语言结构体填空,要详细解析
第12行的竖棚代码:struct student stu[3]是创建了3名学生,保存在stu数组中;也就可以用for循环遍历学生了
后面初陆拍始化:{"001", 88, 89, 77}是将"001"余悉则赋给了num[10],然后依次赋给x,y,z
在for循环中,通过stu[i]访问学生,学生的姓名就用stu[i].num表示,同理,成绩就用stu[i].x, stu[i].y, stu[i].z表示
Ⅱ C语言如何遍历结构体成员
首先要说明的是结构体是一种自定义的数据类型,结构体中的各成员在内存中的存放方式是连续的,注意是连续的(就像数组侍没的存放一样),这样,你的问题就迎刃而解了:
第一步:假设你已经让一个指针p指向了该结构体,事实上该指针所存放的地址就是那个结构体中的所团腊有成员中的第一个元素的地址(对于你的这个问题,p存放了字符指针变量a的地址),
第二步:p是指向这个结构体的第一个元素,那么怎老或纳么找到第二个元素呢?其实只要将p偏移第一个元素大小就行,例如第一个元素是int型数据,那么第二个元素的地址就是p+sizeof(int),以此类推,后面的元素都可以访问到了。
Ⅲ C语言二叉树树的层次遍历,为什么出错呢求大神
程序仔细看了一下。
关键点是在层遍历的处理上,有一点点小问题。
应该是先压入当前树结点的左右子树,再弹出当前结旦宴点。
你却是先弹出了模睁银,那还结点都释放了,那里还有结点的左右子树呢?
修改如下,供参考:
#include <stdio.h>早悔
#include <malloc.h>
/*树结点结构体*/
struct tree{
char data;
struct tree *lchild,*rchild;
};
/*队列*/
struct queue{
struct tree *elem;
struct queue *next;
};
/*队列信息表*/
struct queuenode{
struct queue *front,*rear;
};
/*初始化队列信息表*/
struct queuenode *init(struct queuenode *s){
s=(struct queuenode *)malloc(sizeof(struct queuenode));
s->front=(struct queue*)malloc(sizeof(struct queue));
/*s->rear=(struct queue*)malloc(sizeof(struct queue)); 这个是多余的*/
s->rear=s->front;
s->rear->next=NULL;
return s;
}
/*入队*/
void in_queue(struct queuenode *s,struct tree *ch){
struct queue *p;
p=(struct queue*)malloc(sizeof(struct queue));
p->elem=ch;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
/*出队*/
void out_queue(struct queuenode *s){
struct queue *p;
if(s->front->next!=NULL){
p=s->front->next;
printf("%2c",p->elem->data);
s->front->next=p->next;
if(s->front->next==NULL)
s->rear=s->front;
free(p);
}
}
/*建立树*/
struct tree *create(struct tree *tree){
char ch;
scanf(" %c",&ch);
if(ch=='#')
tree=NULL;
else{
tree=(struct tree *)malloc(sizeof(struct tree));
tree->data=ch;
tree->lchild=create(tree->lchild);
tree->rchild=create(tree->rchild);
}
return tree;
}
/*层遍历*/
void levelorder(struct tree *tree){
struct queuenode *s;
/*这一段没有用
struct tree *a[100];
int rear=0,front=0;
*/
s=init(s);
if(tree){
in_queue(s,tree); /*先插入一个结点*/
while(s->front->next!=NULL){
if(s->front->next->elem->lchild) /*应先插入当前结点的左右子结点*/
in_queue(s,s->front->next->elem->lchild);
if(s->front->next->elem->rchild)
in_queue(s,s->front->next->elem->rchild);
out_queue(s);/*弹出当前结点*/
}
}
}
void main(){
struct tree *t;
printf("输入节点值(按照先序遍历输入)");
t=create(t);
printf("按层遍历(队列):");
levelorder(t);
}
测试用数据:124##5##36##7##
输出: 1 2 3 4 5 6 7
Ⅳ C语言遍历结构体数组
//Win32Project1.cpp:定义应用程序的入口点。
//
#include"stdafx.h"
#include"Win32Project1.h"
#defineMAX_LOADSTRING100
//全局变量:
HINSTANCEhInst; //当前实例
TCHARszTitle[MAX_LOADSTRING]; //标题栏文本
TCHARszWindowClass[MAX_LOADSTRING]; //主窗口类名
//此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCEhInstance);
BOOL InitInstance(HINSTANCE,int);
LRESULTCALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACK About(HWND,UINT,WPARAM,LPARAM);
intAPIENTRY_tWinMain(_In_HINSTANCEhInstance,
_In_opt_HINSTANCEhPrevInstance,
_In_LPTSTRlpCmdLine,
_In_intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:在此放置代码。
MSGmsg;
HACCELhAccelTable;
//初始化全局字符串
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDC_WIN32PROJECT1,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
if(!InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_WIN32PROJECT1));
//主消息循环:
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int)msg.wParam;
}//
//函数:MyRegisterClass()
//
//目的:注册窗口类。
//
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style =CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc =WndProc;
wcex.cbClsExtra =0;
wcex.cbWndExtra =0;
wcex.hInstance =hInstance;
wcex.hIcon =LoadIcon(hInstance,MAKEINTRESOURCE(IDI_WIN32PROJECT1));
wcex.hCursor =LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =MAKEINTRESOURCE(IDC_WIN32PROJECT1);
wcex.lpszClassName =szWindowClass;
wcex.hIconSm =LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));
returnRegisterClassEx(&wcex);
}
//
//函数:InitInstance(HINSTANCE,int)
//
//目的:保存实例句柄并创建主窗口
//
//注释:
//
//在此函数中,我们在全局变量中保存实例句柄并
//创建和显示主程序窗口。
//
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
hInst=hInstance;//将实例句柄存储在全局变量中
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
//
//函数:WndProc(HWND,UINT,WPARAM,LPARAM)
//
//目的:处理主窗口的消息。
//
//WM_COMMAND -处理应用程序菜单
//WM_PAINT -绘制主窗口
//WM_DESTROY -发送退出消息并返回
//
//
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
switch(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//分析菜单选择:
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
break;
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//TODO:在此添加任意绘图代码...
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}
//“关于”框的消息处理程序。
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)
{
UNREFERENCED_PARAMETER(lParam);
switch(message)
{
caseWM_INITDIALOG:
return(INT_PTR)TRUE;
caseWM_COMMAND:
if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,LOWORD(wParam));
return(INT_PTR)TRUE;
}
break;
}
return(INT_PTR)FALSE;
}
Ⅳ C语言编程问题,麻烦用结构体,谢谢
你问题不全,任务2没贴出来。按照编弯滚程习惯,分4个函数:
一、主函数,按顺序调用其他函数完成功能。
二、输入函数,对结构体数组输入信息。
三、输出函数,对指定的结构数组输出信息(传递长度1的地址,就表示一个结构体)。
四、查询学分最大的课程,埋猜余实现遍历结构数组,返回需要的结构数组元素。
ps:所有结构数组传参,都伴随另一个长度参数,表示数组长度。
#include<stdio.h>
typedef struct course
{
char cName[20];//课程名
char tName[10];//讲师名
int pn;//学生人数
int socre;//学分
}CRE;
void inputInfo(CRE cres[],int len);//信息输入
void outputInfo(CRE cres[],int len);//信息输出
CRE *getMaxBysocre(CRE cres[],int len);//获取学分最大的课程,返回课程结构
int main()
{
CRE cres[4],*cMax=NULL;//结构数组
inputInfo(cres,4);
printf("输入的信息为: ");
outputInfo(cres,4);
cMax=getMaxBysocre(cres,4);
printf("学分最大的学科为: ");
outputInfo(cMax,1);
return 0;
}
void outputInfo(CRE cres[],int len)
{
int i;
for(i=0;i<len;printf(" "),i++)
{
printf("课程名:%s ",cres[i].cName);
printf("讲师名:%s ",cres[i].tName);
printf("学生数:%d ",cres[i].pn);
printf("学分数:%d ",cres[i].socre);
兆谨 }
}
void inputInfo(CRE cres[],int len)
{
int i;
for(i=0;i<len;printf(" "),i++)
{
printf("课程名:"),scanf("%s",cres[i].cName);
printf("讲师名:"),scanf("%s",cres[i].tName);
printf("学生数:"),scanf("%d",&cres[i].pn);
printf("学分数:"),scanf("%d",&cres[i].socre);
}
}
CRE *getMaxBysocre(CRE cres[],int len)
{
int i,max;
CRE *crep=NULL;
for(i=0,max=cres[0].socre;i<len;i++)
if(cres[i].socre>max)
crep=&cres[i],max=cres[i].socre;
return crep;
}
Ⅵ (高分回报)C语言 数据结构线索二叉树的遍历,为什么没办法打出结果来在线等,急用
在那个生成二埋祥叉树哪里写挂了,察散造成了超出预期的递归循环。。是因为你用的getchar()读取字符造成你输入的时候会把空格当作字符给读进去,所以当然你的程序会递归调用很多次。。。建议你将你的结构体中的data改为char*类型,输入改为读一个字符串,scanf("%s",ch);这样就弯没搏不会将空格当作输入字符了,因为我们知道scanf是忽略空格的。。。这样改过之后是可以的。。。我在g++下测试了的。。lz试一下。。。
Ⅶ C 语言关于结构体做参数传递
双指针
C语言结构体传参
小-黯
原创
关注
7点赞·2315人阅读
目录
C语言结构体传参
1. 普通传参
1.1 测试代码
1.2 测试结果
1.3 结果分析
2. 单指针传参
2.1 修改结构体数据
2.1.1 测试代码
2.1.2 测试结果
2.1.3 结果分析
2.2 修改结构体地址
2.2.1 测试代码
2.2.2 测试结果
2.2.3 结果分析
3. 双指针传参
3.1 测试代码
3.2 测试结果
3.2 结果分析
C语言结构体传参
结构体传参包括三种传参方式
普通传参:函数接收到结构体参数后,会复制一份原来的结构体作为形参供函数使用,而函数内的任何操作都是对拷贝结构体的修改,不会影响到原本的结构体变化。
单指针传参:函数接收的是一个结构体的地址,该指针指向的是结构体起始地址,也就相当于传入了结构体内所有变量的地址,函数接收到该结构体指针后,我们就可以根据地址访问结构体中每个变量的真实数据,在函数内对结构体内数据的操作,都会影响到原本结构体内数据的变化
双指针传参:函数接收的是结构体指针变量的地址樱败,因为一级指针代表的是结构体的激没地址,在函数中能够操作结构体内的数据,则二级指针指向的明颂纳是结构体的地址,则同理我们可以根据二级指针访问修改结构体的地址
即通过一级指针,对结构体内数据的操作会影响到原本结构体内数据的变化
而通过二级指针,对结构体地址的操作会影响到原本结构体地址的变化,例如为结构体分配空间
Ⅷ C语言 结构体数组 计算个数
给数组初始化,判断值是否被改变-----------------这题没意义的
Ⅸ C语言中如何实现对结构体的查找以及输出
C语言的结构体是一组数据的组合,并不是简单的单一类型。所以在查找和输出的时候,均不能直接操作,而是要进行变通。
1 查找。
对于以某一项为关键字进行查找时,比如在结构体中有int型的成员a,要查找a为100的结构体变量,这时需要遍历每个结构体(数组、链表、或者其它任意形式),对每个元素的成员a值进行比较,符合的则表示查找成功。
对于结构体中元素较多,同时要对整个结构体每个元素都匹配才算查找到的特殊情况,可以使用memcmp的方式,整体进行比较,以减少代码量。不过这种情况较为少见,不过多描述。
2 输出。
对于结构体的输出,其实就是对其每一项,或者若干项成员变量的输出。
所以可以使用基本的输出函数,对每一项单独输出,输出中为了方便阅读,可以加一些说明文字。
如果对结构体输出有多处调用的需求,可以在将该功能封装为函数,供各个需要的函数调用。这样的好处是,当结构体的成员出现变化,或者结构体输出要求更改时,修改一处代码即可完成所有的输出修改,实现易于维护的效果。
Ⅹ C语言遍历目录中的文件
使用dir.h库的两个函数即可:findfirst和findnext。
首先调用findfirst函数查找是否有满足条件的某目录文件,如果返回值非0则表示找不到返回。
如果findfirst返回值为0,则循环调用findnext函数,根据返回值,如果为0,结束循环,遍历结束。否则循环调用findnext即可遍历,直到返回非0值即可。
当然,这两个函数需要定义一个结构体来存储函数返回的数据。结构体如下:
struct
ffblk
{
char
ff_reserved[21];
/*DOS保留字*/
char
ff_attrib;
/*文件属性*/
int
ff_ftime;
/*文件时间*/
int
ff_fdate;
/*文件日期*/
long
ff_fsize;
/*文件长度*/
char
ff_name[13];
/*文件名*/
}
将结构体中的ff_name[13]显示出来即可。