Ⅰ 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]顯示出來即可。