如何用c语言列出目录树
给你一个参考:
相关函数:opendir
表头文件:#include <ftwh>
定义函数:int ftw(const char dir, int (fn) (const file, const struct stat sb, int flag), int depth)
函数说明:ftw() 会从参数dir指定的目录开始,往下一层层地递归式遍历子目录。ftw()会传三个参数给fn(), 第一个参数file指向当时所在的目录路径,第二个参数是sb, 为stat结构指针,第三个参数为旗标,有下面几种可能值
FTW_F 一般文件
FTW_D 目录
FTW_DNR 不可读取的目录,此目录以下将不被遍历
FTW_SL 符号连接
FTW_NS 无法取得stat结构数据,有可能是权限问题
最后一个参数depth代表ftw()在进行遍历目录时同时打开的文件数。ftw()在遍历时每一层目录至少需要一个文件描述词,如果遍历时用完了depth所给予的限制数目,整个遍历将因不断地关文件和开文件操作而显得缓慢
如果要结束ftw()的遍历,fn()只需返回一非零值即可,此值同时也会是ftw()的返回值。否则ftw()会试着走完所有的目录,然后返回0
返 回 值:遍历中断则返回fn()函数的返回值,全部遍历则返回0,若有错误发生则返回-1
附加说明:由于ftw()会动态配置内存使用,请使用正常方式(fn函数返回非零值)来中断遍历,不要在fn函数中使用longjmp()
示例:
/列出/etc/X11目录下的子目录/
#include <sys/stath>
#include <unistdh>
#include <ftwh>
int fn(const char file, const struct stat sb, int flag)
{
if(flag == FTW_D)
printf("%s --- directory\n", file);
else
printf("%s \n",file);
return 0;
}
int main()
{
ftw("/etc/X11",fn,500);
}
以下程序已在win-tc和tc20下运行通过,已加详细注释(本人所写)。
/ 数据安全实用程序,加密解密简单程序 /
#include<stdioh>
#include<stdlibh>
#include<conioh>
int flag;
char encrypt(char ch,int key)/加密函数,把字符循环移位/
{
if(ch>='a' && ch<='z') / 如果是小写字母 /
{
ch=(ch-'a'+key%26)%26+'a'; / 字母向后移key%26个位置,超过字母z则再从a开始向后移动 /
}
else if(ch>='A' && ch<='Z') / 如果是大写字母 /
{
ch=(ch-'A'+key%26)%26+'A'; / 字母向后移key%26个位置,超过字母Z则再从A开始向后移动 /
}
return ch;
}
char decrypt(char ch,int key)/解密函数,把字符循环移位/
{
if(ch>='a' && ch<='z') / 如果是小写字母 /
{
ch=(ch-'a'+26-key%26)%26+'a'; / 字母向后移26-key%26个位置,超过字母z则再从a开始向后移动 /
}
else if(ch>='A' && ch<='Z') / 如果是大写字母 /
{
ch=(ch-'A'+26-key%26)%26+'A'; / 字母向后移26-key%26个位置,超过字母Z则再从A开始向后移动 /
}
return ch;
}
void menu()/菜单,1加密,2解密,3显示文本文件内容/
{
clrscr();
printf("\n=======================================================");
printf("\n1Encrypt the text file"); / 加密文件 /
printf("\n2Decrypt the text file"); / 解密文件 /
printf("\n3Display text file contents");/ 显示加密或解密或未加密或解密的文件 /
printf("\n4Quit\n");
printf("=========================================================\n");
printf("Please select a item:"); / 选择一个菜单 /
}
void logo()/显示程序信息/
{
printf("\nwelcome to encrypt program \n ");
return;
}
void encrypt_decrypt_File(char infile,int key, char outfile) / 加密或解密函数 /
{
FILE in,out;
char ch;
clrscr(); / 清屏 /
if((in=fopen(infile,"r"))==NULL) / 打开欲加密或解密的文件/
{
printf("Can not open the infile!\n"); / 如果打开文件失败或文件不存在打印打开失败信息 /
printf("Press any key to exit!\n");
getch(); / 并等待任一按键然后退出程序 /
exit(0);
}
if((out=fopen(outfile,"w"))==NULL) / 打开文件保存加密或解密后的内容/
{
printf("Can not open the outfile!\n"); / 如果打开文件失败或文件不存在打印打开失败信息 /
printf("Press any key to exit!\n"); / 并等待任一按键然后退出程序 /
fclose(in); / 关闭输入文件 /
getch(); / 等待按键,按任一键退出程序 /
exit(0);
}
ch=fgetc(in); /从文本文件中读入字符/
while(ch!=EOF)/加密或解密/
{
/如果是英文字符,则进行加密或解密,否则,不进行加密或解密处理/
if((ch>='a' && ch<='z' ) || (ch>='A' && ch<='Z'))
{ if(flag==1)
fputc(encrypt(ch,key),out);
if(flag==2)
fputc(decrypt(ch,key),out);
}
else
fputc(ch,out);
ch=fgetc(in);
}
/关闭输入及输出文件/
fclose(in);
fclose(out);
}
void displayFile(char infile) /将文本文件的内容显示在屏幕上/
{
FILE fp;
char string[81];
if((fp=fopen(infile,"r"))==NULL) / 以只读方式打开文本文件 /
{
printf("cann't open file");exit(0); / 如果文件不存在或打开失败打印无法打开信息并退出程序 /
}
while(fgets(string,81,fp)!=NULL)
fputs(string,stdout); /把所取字符串送到屏幕显示/
fclose(fp); / 关闭文件 /
}
int main()
{
int i,n;
char ch0,ch1;
char infile[40],outfile[40];
textbackground(LIGHTGRAY); /设置背景颜色为浅灰色/
textcolor(BLACK); /设置文字颜色为黑色/
clrscr();/清除屏幕显示/
logo(); /显示程序信息/
sleep(2); / 延时2秒 /
menu(); /显示屏幕菜单/
ch0=getche();/等待用户从键盘输入,并把输入显示在屏幕上/
while(ch0!='4')
{
clrscr();
if(ch0=='1') /选择加密功能/
{
flag=1;
printf("\nPlease input the infile to be encrypted:"); / 输入要加密的文件名 /
scanf("%s",infile); / 该文件要和本程序放在同一个目录下 /
printf("Please input the encrypt key:");
scanf("%d",&n);/输入加密密码/
printf("Please input the outfile:"); /输入存放加密内容的文件名/
scanf("%s",outfile); / 该文件可以自动创建 /
encrypt_decrypt_File(infile,n,outfile);
printf("\nEncrypt is over!\n");/ 加密成功 /
sleep(1); / 延时1秒 /
}
else if(ch0=='2') /选择解密功能/
{
flag=2;
printf("\nPlease input the infile to be decrypted:"); / 输入要解密的文件名 /
scanf("%s",infile); / 该文件要和本程序放在同一个目录下 /
printf("Please input the decrypt key:");
scanf("%d",&n);/输入解密密码,加密和解密密码应相同/
printf("Please input the outfile:"); /输入存放解密内容的文件名/
scanf("%s",outfile); / 该文件可以自动创建 /
encrypt_decrypt_File(infile,n,outfile);
printf("\nDecrypt is over!\n");
sleep(1); / 延时1秒 /
}
else if(ch0=='3') /选择显示文本文件功能/
{
printf("\nPlease input the infile to be displayed:"); / 输入要显示的文件名 /
scanf("%s",infile);
displayFile(infile);/ 显示文件 /
getch();
}
else
{ /不合法输入/
printf("\nplease input a valid number(1-4)\n");
sleep(1); / 延时1秒 /
}
menu();/显示程序菜单/
ch0=getche(); /等待用户下一次的功能选择/
}
system("cls");/清除屏幕/
logo(); /显示程序信息/
printf("\nGood Bye!\n");
sleep(2);/ 延时2秒 /
system("pause"); / 暂停,按任一键退出程序 /
return 0;
}
#include <stdioh>
#include <stringh>
#include <malloch>
#include <stdlibh>
#include <mathh>
#define STACK_SIZE 20
struct OPND
{
int num;
};
struct OPTR
{
char op;
};
struct OPND ntop,nbase;
struct OPTR otop,obase;
int InitStackNum()
{
nbase = (OPND )malloc(STACK_SIZE sizeof(OPND));
if(!nbase)
exit(-1);
ntop = nbase;
return(1);
}
int InitStackOP()
{
obase = (OPTR )malloc(STACK_SIZE sizeof(OPTR));
if(!obase)
exit(-1);
otop = obase;
return(1);
}
int PushOPND(int InNum)
{
ntop->num = InNum;
ntop++;
return(1);
}
int PushOPTR(char InOP)
{
otop->op = InOP;
otop++;
return(1);
}
int PopOPND()
{
ntop--;
return(ntop->num);
}
char PopOPTR()
{
otop--;
return(otop->op);
}
int GetTopNum()
{
int GetNum;
ntop--;
GetNum = ntop->num;
ntop++;
return(GetNum);
}
char GetTopOP()
{
char GetOP;
otop--;
GetOP = otop->op;
otop++;
return(GetOP);
}
char CompareOP(char ComChar) //此函数用于算符的优先级比较
{
char ComResult,GOP;
int i,j,a,b,c,d;
char StoreOP[4][2] = {{'+','-'},{'','/'},{'(',')'},{'#','#'}};
GOP = GetTopOP();
for(i=0;i<4;++i)
{
for(j=0;j<2;++j)
{
if(GOP==StoreOP[i][j])
{
a=i;
b=j;
}
}
}
for(i=0;i<4;++i)
{
for(j=0;j<2;++j)
{
if(ComChar==StoreOP[i][j])
{
c=i;
d=j;
}
}
}
if((a==0&&c==0)||(a==1&&b==0)||(a==1&&c==1)||(GOP==')'&&ComChar!='(')||(ComChar==')'&&GOP!=')')||(ComChar=='#'&&GOP!='#'))
ComResult='>';
else if((GOP==')'&&ComChar=='(')||(ComChar=='#'&&GOP!='#'))
{
printf("表达式输入错误,请重新输入!\n");
exit(-1);
}
else if(GOP=='('&&ComChar==')')
ComResult='=';
else
ComResult='<';
return(ComResult);
}
int IsOP(char isop)
{
switch(isop)
{
case '+':
case '-':
case '':
case '/':
case '(':
case ')':
return(1);
default:
return(0);
}
}
int Operate(char GetOP)
{
int a,b;
a = PopOPND();
b = PopOPND();
switch(GetOP)
{
case '+':
return(b+a);
case '-':
return(b-a);
case '':
return(ba);
case '/':
{
if(a==0)
{
printf("除数不能为0,请重新输入!\n");
exit(-1);
}
else
return(b/a);
}
}
}
void main()
{
InitStackNum();
InitStackOP();
PushOPTR('#');
printf("请输入表达式,以\"#\"结尾\n");
char ch;
ch = getchar();
while(ch!='#' || GetTopOP()!='#')
{
int sum=0;
while(IsOP(ch)==0)//是操作数
{
if(ch=='#') break;
sum=sum10+ch - '0';
ch=getchar();
if(IsOP(ch)!=0)
{
PushOPND(sum);
}
}
switch(CompareOP(ch))
{
case '<':
{
PushOPTR(ch);
ch=getchar();
break;
}
case '=':
{
PopOPTR();
ch=getchar();
break;
}
case '>':
{
PushOPND(Operate(PopOPTR()));
//ch=getchar();
break;
}
}// switch
printf("所求结果是: %d\n",GetTopNum());
free(nbase);
free(obase);
}
这个应该属于数据结构的,你要先把各个结果弄清楚再去研究如何编程实现
这个树的高度怎么跟你解释呢树的高度其实就是深度树中结点的最大层次称为树的深度这样说你明白吗就是从根开始,你看一共有多少层,就是高度了如果你这样还不明白的话就建议你看看数据结构吧
1、路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
2、结点的权及带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
3、树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。
如何用c语言列出目录树
本文2023-10-15 13:57:50发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/258851.html