C语言结构体指针问题求修改

#include
int main(void)
{
struct student {
int num;
char name[19];
double score;
};
int i,k,N;
scanf("%d",&N);
for(i=0;i {
struct student s[3];
struct student *p;
for(k=0;k scanf("%d%s%lf",&s[k].num,&s[k].name,&s[k].score);
p = &s[k];
}
for(k=0;k printf("%d\t%-20s%lf\n",s[k].num,s[k].name,s[k].score);
}
for(k=0;k printf("%d\t%-20s%lf\n",p->num,p->name,p->score);
}
}
return 0;
}
编译器显示:Your Code: In function 'main':
Your Code:17:19: warning: format '%s' expects argument of type 'char ', but argument 3 has type 'char ()[19]' [-Wformat=]
scanf("%d%s%lf",&s[k].num,&s[k].name,&s[k].score);
^
0:编译失败,请检查源代码!

请问如何解决这个问题?谢谢各位好心人!急急急!!!


3个回答

 scanf("%d%s%lf",&s[k].num,&s[k].name,&s[k].score);

应为:

 scanf("%d%s%lf",&s[k].num,s[k].name,&s[k].score);

看一下结构体中name的定义:

 char name[19]; //数组名name就是数组的首地址,所以用%s读入时,不用再加取地址运算符&。

用心回答每个问题,如果有帮助,请采纳答案好吗,谢谢~~~

ghy19980814
ghy19980814 谢谢!
接近 3 年之前 回复

提问显示好像有些问题
#include
int main(void)
{
struct student {
int num;
char name[19];
double score;
};
int i,k,N;
scanf("%d",&N);
for(i=0;i {
struct student s[3];
struct student *p;
for(k=0;k scanf("%d%s%lf",&s[k].num,&s[k].name,&s[k].score);
p = &s[k];
}
for(k=0;k printf("%d\t%-20s%lf\n",s[k].num,s[k].name,s[k].score);
}
for(k=0;k printf("%d\t%-20s%lf\n",p->num,p->name,p->score);
}
}
return 0;
}
编译器显示:Your Code: In function 'main':
Your Code:17:19: warning: format '%s' expects argument of type 'char ', but argument 3 has type 'char ()[19]' [-Wformat=]
scanf("%d%s%lf",&s[k].num,&s[k].name,&s[k].score);
^
0:编译失败,请检查源代码!

请问如何解决这个问题?谢谢各位好心人!急急急!!!

for(i=0;i小于N;i++)
for(k=0;k小于3;k++)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于C语言结构体指针数组的问题
``` #include<stdio.h> //结构体 struct student { int iNum; char cName[16]; float fChineseScore; float fMathScore; float fEnglishScore; }; typedef struct student STUDENT; //输入 void InputTranscript(STUDENT MyClass[], int num) { int i; printf("请输入学生的成绩信息:\n"); for (i = 0; i < num; i++) { scanf("%d %s %f %f %f", &MyClass[i].iNum, MyClass[i].cName, &MyClass[i].fChineseScore, &MyClass[i].fMathScore, &MyClass[i].fEnglishScore); } } //输出单体 void DisplayTranscriptOne(STUDENT MyScore) { int i; STUDENT *p1 = MyScore; printf("请输入需要显示成绩信息的学生的序号:"); scanf("%d", &i); printf("输出学生的成绩信息:\n"); printf("%d %s %f %f %f", (p1 + i) -> iNum, (p1 + i) -> cName, (p1 + i) -> fChineseScore, (p1 + i) -> fMathScore, (p1 + i) -> fEnglishScore); } //输出全体 void DisplayTranscriptAll(STUDENT *MyClass, int num) { printf("输出全体学生的成绩信息\n"); for (; MyClass < MyClass + num; MyClass++) { printf("%d %s %f %f %f", MyClass -> iNum, MyClass -> cName, MyClass -> fChineseScore, MyClass -> fMathScore, MyClass -> fEnglishScore); } } //修改 void ModifyOne(STUDENT *MyInfo) { int i; printf("请输入需修改个人信息的学生的序号:"); scanf("%d", &i); printf("请继续输入修改后的信息:"); scanf("%d %s %f %f %f", (MyInfo + i) -> iNum, &(MyInfo + i) -> cName, &(MyInfo + i) -> fChineseScore, &(MyInfo + i) -> fMathScore, &(MyInfo + i) -> fEnglishScore); } void main(void) { STUDENT sTranscript[10]; InputTranscript(sTranscript, 10); DisplayTranscriptOne(sTranscript); DisplayTranscriptAll(*sTranscript, 10); ModifyOne(*sTranscript); } ``` --------------------Configuration: 4 - Win32 Debug-------------------- Compiling... 4.c C:\Users\20453\Desktop\王俊森\4\4.c(30) : error C2115: 'initializing' : incompatible types C:\Users\20453\Desktop\王俊森\4\4.c(62) : error C2115: 'function' : incompatible types C:\Users\20453\Desktop\王俊森\4\4.c(62) : warning C4024: 'DisplayTranscriptOne' : different types for formal and actual parameter 1 C:\Users\20453\Desktop\王俊森\4\4.c(63) : error C2115: 'function' : incompatible types C:\Users\20453\Desktop\王俊森\4\4.c(63) : warning C4024: 'DisplayTranscriptAll' : different types for formal and actual parameter 1 C:\Users\20453\Desktop\王俊森\4\4.c(64) : error C2115: 'function' : incompatible types C:\Users\20453\Desktop\王俊森\4\4.c(64) : warning C4024: 'ModifyOne' : different types for formal and actual parameter 1 Error executing cl.exe. 4.obj - 4 error(s), 3 warning(s)
关于c语言结构体指针的小问题
current = &(list->anchor); printf("%p\n", (void*) current); printf("%p\n", (void*) &(list->anchor)); printf("此时指针相同\n"); printf("---\n"); printf("%p\n", (void*) current->prev); printf("%p\n", (void*) &(list->anchor.prev)); printf("他们的prev并不相同???current->prev是null??\n"); printf("---\n"); current->prev = newElem; printf("%p\n", (void*) &(list->anchor.prev)); printf("%p\n", (void*) current->prev); printf("修改current的prev并不能影响list->anchor的prev\n"); ``` 输出结果 00000000007113E8 00000000007113E8 此时指针相同 --- 0000000000000000 00000000007113F8 他们的prev并不相同???current->prev是null?? --- 00000000007113F8 000000000062FDD0 修改current的prev并不能影响list->anchor的prev 之前会点Java 把struct指针直接就理解成java里对象的引用了 看来好像不是这么一回事儿 这里想不太明白,求指教。
c语言指针问题和函数调用吧
主函数定义一个指向结构体的指针,调用函数,如果函数的参数也是指向该结构体的指针,为什么不能修改主函数里指针内存中的内容。而如果我参数是一个结构体指针的引用,就可以修改。 按说参数是指针,指针对指针赋值,不是把地址赋了吗?
这是一个关于C语言数据结构的指针的问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; #define OK 1 typedef struct { char name[5]; float price; }Book; typedef struct LNode { Book Elem; LNode *next; }LNode,*List; Status InitList(LNode *B) { B=new LNode(); if(!B) exit(-1); else B->next=NULL; return OK; } int main() { LNode *L; List LL; InitList(L); cout<<L->next; getch(); return 0; } ``` 指针是引用类型,链表结点初始化,我用指针传递,修改结点内容的值,应该L里内容会变的,但是没变,这是为什么呢?
C语言函数传参:如何实现指针参数引用传递
下面是实现二叉树线索化的简单算法,我想通过纯C代码实现指针参数的引用传递,使得函数中的修改得以保存,请问InTread()内的参数应该写成什么样的形式?注:下面的代码可能需要进一步修正;ThreadTree为结构体指针 别名。 ``` typedef struct TreadNode{ ElemType data; struct TreadNode *lchild,*rchild; int ltag,rtag; /*左右线索标志域*/ }ThreadNode,*ThreadTree; void InTread(ThreadTree p,ThreadTree pre){ /*p:指向当前访问的结点,pre:指向上一个访问过的结点,用于构建前驱和后继*/ if(p!=NULL){ InTread(p->lchild,pre); if(p->lchild==NULL){ /*判断是否存在空指针*/ p->lchild = pre; p->ltag = 1; } else if(pre!=NULL&&pre->rchild==NULL){ pre->rchild = p; /*p所指结点为上一个访问结点的后继*/ pre->rtag = 1; } pre = p; InTread(p->rchild,pre); } } ```
c语言实训课程选修管理系统
1.题目描述 编写一个程序对学生的课程选修进行管理。系统能实现以下功能:  添加:添加课程或学生记录,可提供选择所要添加类别的选择界面,要求编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加;  查询:可根据编号、姓名等信息对已有的学生或课程基本信息进行查询;查询选修某门课程的学生;查询某学生学期选修的课程;如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。可提供选择界面供用户选择;  显示:可显示已有学生或课程的信息,每条记录占据一行;  编辑:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性;  删除:对已有的学生或课程记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作;  统计:能根据多种参数进行统计。如能统计某学期开设的课程数,选修某门课程的实际学生人数,选修某门课程的男女生比例,某门课程的平均成绩,某学生学期选修的课程数等;  排序:能根据多种参数进行排序。如对某门课程按实际选修人数升序/降序排序,对某门课程按学生成绩升序/降序排序等;  保存:将当前系统中各类记录存入文件中,存入方式任意;  读取:可将保存在文件中的信息读入到当前系统中,供用户使用。 2.设计提示 (1)学生基本信息包括:学号、班级、姓名、性别、联系方式等信息。课程基本信息包括:课程代码、课程名称、课程性质、总学时、学分、开课学期、选修人数等信息; (2)划分实现课程选修管理的功能模块:如主菜单、添加、修改、查询、统计、保存等功能,并确定各功能模块的实现算法; (3)确定课程选修的数据结构,至少应包括课程代码、学号和课程成绩等; (4)画出主要算法的流程图; (5)选择C语言的技术:普通数组、结构体数组、函数、指针、单链表或文件等; (6)编写程序代码。
大神求指导简单C语言问题 刚刚入门
#include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct _Teacher { struct _Teacher *t; }Teacher; int main() { Teacher teacher1; Teacher teacher2; Teacher * head1 = &teacher1; Teacher * head2 = &teacher2; printf("\n---原来的地址---\n"); printf("T1%16d\n",&teacher1); printf("T1.t%16d\n",&teacher1.t); head1->t = head2; printf("\n----更改内部指针后的地址-------\n"); printf("H1%16d\n",head1); printf("H1.t%16d\n",head1->t); printf("\n--------------------\n"); } 为什么指向结构体Teacher的指针内部的指针可以和Teacher地址不相同; 第一个输出地址是相同的
修改程序:信源编解码(c语言)
修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }
@C语言数据结构大神:顺序栈求n!。13行的错误怎么修改?为啥说我定义栈错误?
``` # include<stdio.h> # include<stdlib.h> # define Max_Size 50 typedef struct{//typedef是小写开头! //注意此处的top是整形指针 int data[Max_Size]; int top; }SeqStack,*PSeqStack; void Init_SeqStack(PSeqStack S) { S->top=-1;//哪里错了?求解释! } int Full_SeqStack(PSeqStack S) { if(S->top==Max_Size-1) return 1; else return 0; } int Empty_SeqStack(PSeqStack S) { if(S->top==-1) return 1; else return 0; } void Push_SeqStack(PSeqStack S,int n) { if(Full_SeqStack(S)==1) exit(0); else {S->top=++S->top;//及时先加一个空间 S->data[S->top]=n;}//栈也有data域! } void Pop_SeqStack(PSeqStack S,int n)//*n也是指针 { if(Empty_SeqStack(S)==1) printf("UnderFlow\n"); else {n=S->data[S->top]; S->top=--S->top;}//及时退一个空间 } int fact(int n,int f,PSeqStack S)//调用函数为什么不对?求解释! { Init_SeqStack(S); while(n!=0) { Push_SeqStack(S,n); n=n-1; } f=1; while(Empty_SeqStack(S)!=1) { Pop_SeqStack(S,n); f=f*n; } return f; } int main() { int n,f;SeqStack *S; printf("input n:\n"); scanf("%d",&n); printf("%d\n",fact(n,f,S)); getch(); } ``` ![图片说明](https://img-ask.csdn.net/upload/201512/06/1449355008_742479.png)
C/C++ char类型指针数组输入问题
# C/C++ char类型指针数组输入问题 数据结构课程设计,要求从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上。 程序代码如下: ```cpp #include <iostream> #include <string.h> #define N 50 #define M 2*N-1 #define MAX 100 using namespace std; typedef struct { char data[5]; int weight; int parent; int lchild; int rchild; }HTNode; typedef struct { char cd[N]; int start; }HCode; void CreatHT(HTNode ht[], int n) { int i,k,lnode,rnode; int min1,min2; for (i=0; i<2*n-1; i++) { ht[i].parent=ht[i].lchild=ht[i].rchild=-1; } for (i=n; i<2*n-1; i++) { min1=min2=32767; lnode=rnode=-1; for (k=0; k<=i-1; k++) { if (ht[k].parent==-1) { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } } ht[lnode].parent=i; ht[rnode].parent=1; ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; } } void CreatHCode(HTNode ht[], HCode hcd[], int n) { int i,f,c; HCode hc; for (i=0; i<n; i++) { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) { if (ht[f].lchild==c) { hc.cd[hc.start--]='0'; } else { hc.cd[hc.start--]='1'; } c=f; f=ht[f].parent; } hc.start++; hcd[i]=hc; } } void DispHCode(HTNode ht[], HCode hcd[], int n) { int i,k; int sum=0,m=0,j; printf("输出哈弗曼编码:\n"); for (i=0; i<n; i++) { j=0; printf(" %s:\t", ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c", hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; } printf("\n平均长度=%g\n", 1.0*sum/m); } int main(int argc, const char * argv[]) { // insert code here... int n,i; char *str[MAX];//这里定义了一个指针数组存放哈夫曼编码 int fnum[MAX]; HTNode ht[M]; HCode hcd[N]; printf("输如字符集大小:"); scanf("%d", &n); printf("输入%d个字符:", n); for (i=0; i<n; i++) { scanf("%s", str[i]);//这里的输入应该如何修改? } printf("输入%d个权值:", n); for (i=0; i<n; i++) { scanf("%d", &fnum[i]); } for (i=0; i<n; i++) { strcpy(ht[i].data, str[i]); ht[i].weight=fnum[i]; } CreatHT(ht, n); CreatHCode(ht, hcd, n); DispHCode(ht, hcd, n); return 1; } ``` 有问题的地方已在主函数中注释,其他的函数都是哈夫曼树的基本算法。 困扰许久求大佬解决!
数据结构单链表建表问题
各位大佬,求教。 单链表中值为y的结点前面插入一个值为x的结点,即使值为x的新结点成为值为y的结点的前驱结点。 以下是代码,不知道为什么creatlistr建表函数没有修改head单链表,return head也一样。 ``` #include <stdio.h> #include <stdlib.h> /************************************/ /* 链表实现的头文件,文件名slnklist.h */ /************************************/ typedef int datatype; typedef struct link_node{ datatype info; struct link_node *next; }node; /*****************************************************/ /* 函数功能:建立一个空的单链表 */ /* 函数参数:无 */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:slnklist.c,函数名:init() */ /******************************************************/ node *init() { return NULL; } /****************************************************/ /* 函数功能:输出单链表中各个结点的值 */ /* 函数参数:指向node类型变量的指针head */ /* 函数返回值:空 */ /* 文件名slnklist.c,函数名display() */ /*****************************************************/ void display(node *head) { node *p; p=head; if(!p) printf("单链表是空的!\n"); else { printf("单链表各个结点的值为:"); while(p) { printf("%5d",p->info);p=p->next;} } } //队列方式建立单链表(尾插法) node *creatlistr(node *head) { node *s,*r=NULL; datatype data; printf("请输入各结点值(以0结束):"); scanf("%d",&data); while (data) { s=(node *)malloc(sizeof(node)); s->info=data; /*产生新结点*/ if (head==NULL) head=s; /*新结点插入空表*/ else r->next=s; r=s; scanf("%d",&data); } /*处理表尾结点指针域*/ if(r!=NULL) r->next=NULL; return head; } //函数功能:在结点值为y的结点前插入一个值为x的结点 node *preinsert(node *head,datatype y,datatype x) { node *p,*q=head; node *pre=NULL; while(q&&q->info!=y) //没有找到并且没有找完 { pre=q; q=q->next; } //pre指向p的前驱结点 if(!q) printf("找不到此结点!"); else { p=(node*)malloc(sizeof(node));/*分配空间*/ p->info=x;/*设置新结点*/ if(!pre) //要插入的是第一个结点 { p->next=head; /*插入(1)*/ head=p; /*插入(2)*/ } else { p->next=pre->next;/*插入(1)*/ pre->next=p;/*插入(2)*/ } } return head; } void main() { node *head=init(); datatype x,y; //插入值 creatlistr(head); display(head); printf("请输入要在值为?的结点前插入结点?: "); scanf("%d%d",&y,&x); display(preinsert(head,y,x)); } ```
请问为什么我用C语言写的线性表的链式存储结构的遍历输出值无法输出。而且代码没有警告和错误
测试环境VC6.0 ``` #include<stdlib.h> #include<stdio.h> typedef int Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef struct NODE{ //定义 int a; struct NODE*next; //这里struct也应该添加. }Node; void InitList(Node*la){//头节点创建 la=(Node*)malloc(sizeof(Node)); la->next=NULL; } Status ListInsert(Node*a,int i,int e) {//在i-1,i中插入元素,就是在第I个位置插入。 Node*p,*c; int j=0; p=a; c=NULL; while(j<i) {p=p->next;j++;} //p与p->next都为指针变量,;不能忘记// if(j<0||j>i) return ERROR ; //一次执行完的判断 c=(Node*)malloc(sizeof(Node)); c->a=e; c->next=p->next; //空指针域的继承与修改 p->next=c; return OK; } Status TraverseList(Node a) {//遍历链表并且输出每个节点 Node*p; p=a.next; printf("遍历结果是\n"); while(p!=NULL) { printf("%d",p->a); p=p->next; } return OK; } void main() { Node a; int b,e,j; j=1; InitList(&a); printf("请插入个数"); scanf("%d",&b); printf("请输入"); for(;j<=b;j++) { scanf("%d",&e); ListInsert(&a,j,e); } TraverseList(a); } ```
关于c二级指针传递的一些问题
最近在学数据结构,感觉二级指针的用法很高级,想把数组初始化操作改成函数形式,但是运行总是闪退,发现不了有什么错误,各位大神能帮忙分析一下吗? 如下代码一为可运行成功的代码,代码二为修改后闪退的函数, 测试是scanf语句引发的闪退,注释掉就不会闪退了,但是实际运行的时候却可以运行完,或者说运行过初始化数组操作就会闪退,之后的代码也可以运行(比如在后面 加一句"printf("1");",实测可以输入最后一个数后打印出1 , 但是 注释掉还是会闪退,所以应该不是之后代码的问题),麻烦各路大神帮忙分析一下吧,感激不尽,谢谢! 1 ``` #include<stdio.h> #include<stdlib.h> typedef int *intp; //void Init(int n, intp *a ); //void print( int n, intp a ); // int main(){ int num,i; intp a; printf("please input how many numbers you want to sort:"); scanf("%d",&num); a = ( intp )malloc( num * sizeof( int )); printf("please input numbers:\n"); for( i=0; i<num; i++ ){ printf("a[%d]=",i); scanf("%d",&a[i]); } for( i=0; i<num; i++ ){ printf("a[%d]=%d",i,a[i]); printf("\n"); } } ``` 2 ``` #include<stdio.h> #include<stdlib.h> typedef int *intp; void Init(int n, intp *a ); void print( int n, intp a ); int main(){ int num; intp a; printf("please input how many numbers you want to sort:"); scanf("%d",&num); Init( num, &a); print(num, a); } void Init(int n, intp *a){ int i; *a = ( int * )malloc( n * sizeof( int )); printf("please input numbers:\n"); for( i=0; i<n; i++ ){ printf("a[%d]=",i); scanf("%d",&(*(a+i))); } } void print( int n, intp a ){ int i; for( i=0; i<n; i++ ){ printf("a[%d]=%d",i,a[i]); printf("\n"); } } ```
C语言 为什么编译没问题运行时显示exe停止工作?
//main.c #include <stdio.h> #include <stdlib.h> #include "list.h" int main() { struct Word *head; head=creatLink(); listToFile(head); return 0; } //list.h #ifndef _LIST_H #define _LIST_H struct Word { char japanese[20];//日文 char kana[20];//假名 int accent;//声调 char property[10];//词性 char chinese[30];//中文 struct Sentense *head2;//句子结构体链表的头指针 struct Word *next;//下一个结点地址 }; struct Sentense { char sentense[50];//例句 struct Sentense *next;//下一个结点地址 }; FILE *inputOneWord_F(struct Word *p,FILE *fp); struct Word *creatLink(); FILE *outputOneWord_F(struct Word *t,FILE *fp); void listToFile(struct Word *head); #endif // _LIST_H //list.c #include <stdio.h> #include <stdlib.h> #include "list.h" #define LEN sizeof(struct Word) #define LEN2 sizeof(struct Sentense) //将文件中一个Word结构体中的所有数据读入p所指向的链表结点,返回值为指针目前在文件中所在的位置 FILE *inputOneWord_F(struct Word *p,FILE *fp) { char a; fscanf(fp,"%s%s%d%s%s",p->japanese,p->kana,&p->accent,p->property,p->chinese); struct Sentense *g,*tail=NULL; //新建Sentense结构体单链表 p->head2=NULL; while(1){ fgetc(fp);//吸收换行符 a=fgetc(fp);//通过是否为换行符来判断当前单词有无例句 if(a=='\n'||feof(fp)) break; //说明此单词无例句返回指针目前在文件中所在的位置,进行下一个单词的读取 else{ fseek(fp,-1l,SEEK_CUR);//光标向前一个字符 fputc(a,fp);//将刚才从文件读取的字符按原样写入文件(位置不变) g=(struct Sentense*)malloc(LEN2);// fscanf(fp,"%s",g->sentense); if(p->head2==NULL)p->head2=g;//如果链表为空,新建立的结点就是链表的头结点 else tail->next=g; tail=g;//tail永远指向链表的尾结点 } } tail->next=NULL; return fp; } //在程序执行之初将上一次存储在文件中的全部数据读入新建Word结构体单链表,函数返回单链表头指针 struct Word *creatLink() { struct Word *p,*head=NULL,*rear=NULL; FILE *fp; fp=fopen("WordList.txt","r"); if(fp==NULL) { printf("单词表为空!"); return head; } p=(struct Word*)malloc(LEN); fp=inputOneWord_F(p,fp);//更改指针在文件中所在的位置 while(!feof(fp)) { if(head==NULL)head=p; else rear->next=p; rear=p; p=(struct Word*)malloc(LEN); fp=inputOneWord_F(p,fp); } rear->next=p; rear=p; rear->next=NULL; fclose(fp); return head; } FILE *outputOneWord_F(struct Word *t,FILE *fp) { fprintf(fp,"\n%s %s %d %s %s\n",t->japanese,t->kana,t->accent,t->property,t->chinese); struct Sentense *p; p=t->head2; //p为指向Word结构体中Sentense结构体链表的头指针; while(p!=NULL) { fprintf(fp,"%s\n",p->sentense); p=p->next; } return fp; } //程序运行结束之际将链表中的数据全部写入文件 void listToFile(struct Word *head) { FILE *fp; fp=fopen("WordList2.txt","w"); struct Word *p; p=head; while(p!=NULL) { fp=outputOneWord_F(p,fp); p=p->next; } fclose(fp); }
(C语言)在二叉搜索树的学习时遇到了问题,求大佬帮忙看看
如题,在学习二叉搜索树时想要自己添加一些内容,但是不知道为什么就是会出错,自己感觉好像问题出在创建二叉树的地方,但是不知道怎么改.希望大佬能帮忙看看,如果能配上讲解就更好了,感谢. 下面贴上代码,之后是罗列的一些问题,如果代码中还有问题希望大佬能指点下我,谢谢: 项目总共三个文件,二叉搜索树头文件.h和.c文件,然后一个用于测试的主函数.c (二叉搜索树头文件) BSTree.h ``` #ifndef BSTREE_H #define BSTREE_H typedef int DataType; //二叉排序树节点定义 struct BinSearchTreeNode { DataType data; struct BinSearchTreeNode *leftchild; struct BinSearchTreeNode *rightchild; }; typedef struct BinSearchTreeNode *BSTreeNode; typedef struct BinSearchTreeNode *BinSearchTree; /****************************************************************/ /* BinSearchTree *create() */ /* 功能:创建二叉排序树 */ /* 输入参数:无 */ /* 返回值:二叉排序树 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BinSearchTree create(); /****************************************************************/ /* void InOrder(BinSearchTree ptree) */ /* 功能:中序遍历二叉排序树 */ /* 输入参数ptree:二叉排序树 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void InOrder(BinSearchTree ptree); /****************************************************************/ /* BSTreeNode BSTSearch(BinSearchTree bt, DataType key) */ /* 功能:检索二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要检索的元素 */ /* 返回值:成功返回NULL,失败返回元素插入的父结点位置 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BSTreeNode BSTSearch(BinSearchTree bt, DataType key); /****************************************************************/ /* int BSTInsert(BinSearchTree bt, DataType key) */ /* 功能:在二叉排序树中插入元素key */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要插入的元素 */ /* 返回值:成功插入返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTInsert(BinSearchTree bt, DataType key); /****************************************************************/ /* int BSTgetMax(BinSearchTree *bt) */ /* 功能:查找二叉排序树的最大值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMax(BinSearchTree *bt); /****************************************************************/ /* int BSTgetMin(BinSearchTree *bt) */ /* 功能:查找二叉排序树的最小值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMin(BinSearchTree *bt); /****************************************************************/ /* int BSTDelete1(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法1 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete1(BinSearchTree *bt, DataType key); /****************************************************************/ /* int BSTDelete2(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法2 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete2(BinSearchTree *bt, DataType key); /****************************************************************/ /* void BST_Destory(BinSearchTree bt) */ /* 功能:销毁二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BST_Destory(BinSearchTree bt); #endif // BSTREE_H ``` 对应的c文件 BSTree.c ``` #include <stdio.h> #include <stdlib.h> #include "BSTree.h" /****************************************************************/ /* BinSearchTree create() */ /* 功能:创建二叉排序树,注意这里输入的应该是先序序列,并且保证是一*/ /* 个二叉排序树的先序序列 */ /* 输入参数:无 */ /* 返回值:二叉排序树 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BinSearchTree create() { int ch = 0;//初始化 BinSearchTree bt; scanf_s("%d", &ch); if (ch == -1) { bt = NULL; } else { bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode)); bt->data = ch; //递归赋值左子树 bt->leftchild = create(); //递归赋值右子树 bt->rightchild = create(); } //返回根节点 return bt; } /****************************************************************/ /* void InOrder(BinSearchTree ptree) */ /* 功能:中序遍历二叉排序树 */ /* 输入参数ptree:二叉排序树 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void InOrder(BinSearchTree ptree) { if (ptree == NULL) { return; } InOrder(ptree->leftchild); printf("%d", ptree->data); InOrder(ptree->rightchild); } /****************************************************************/ /* BSTreeNode BSTSearch(BinSearchTree bt, DataType key) */ /* 功能:检索二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要检索的元素 */ /* 返回值:成功返回NULL,失败返回元素插入的父结点位置 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BSTreeNode BSTSearch(BinSearchTree bt, DataType key) { BSTreeNode p, parent; p = bt; parent = p; //记录待插入结点的父结点 while (p) { parent = p; //当查找到时提示,返回NULL if (p->data == key) { printf("Exist this key\n"); return NULL; } //根结点大于要查的结点,进入左分支查找 if (p->data > key) { p = p->leftchild; } //根结点小于要查的结点,进入右分支查找 else { p = p->rightchild; } }//p=NULL,跳出循环 return parent; //查找失败,返回parent }//return NULL和parent是为了便于之后的操作 /****************************************************************/ /* int BSTInsert(BinSearchTree bt, DataType key) */ /* 功能:在二叉排序树中插入元素key */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要插入的元素 */ /* 返回值:成功插入返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTInsert(BinSearchTree bt, DataType key) { BSTreeNode p, temp; temp = BSTSearch(bt, key); //temp保存查找之后的结果 //已存在,返回0 if (temp == NULL) { printf("Exist this key\n"); return 0; } //申请结点的内存空间 p = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode)); //申请失败提示 if (p == NULL) { printf("Alloc Failure!\n"); return 0; } p->data = key; //数据域赋值,左右指针域默认为空 //p->leftchild = NULL; //左子树指针域赋值 //p->rightchild = NULL; //右子树指针域赋值 if (key < temp->data) { temp->leftchild = p; //作为左子树插入 } else { temp->rightchild = p; //作为右子树插入 } return 1; } /****************************************************************/ /* int BSTgetMax(BinSearchTree bt) */ /* 功能:查找二叉排序树的最大值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMax(BinSearchTree *bt) { BSTreeNode temp; temp = bt; if (temp) { while (temp->leftchild) { temp = temp->leftchild; } printf("%d", temp->data); } } /****************************************************************/ /* int BSTgetMin(BinSearchTree bt) */ /* 功能:查找二叉排序树的最小值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMin(BinSearchTree *bt) { BSTreeNode temp; temp = bt; if (temp) { while (temp->rightchild) { temp = temp->rightchild; } printf("%d", temp->data); } } /****************************************************************/ /* int BSTDelete1(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法1 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete1(BinSearchTree *bt, DataType key) { BSTreeNode parent, p, maxpl; p = *bt; parent = NULL; //查找被删除的结点 while (p != NULL) { if (p->data == key) break; //查找到了,跳出循环 if (p->data > key) p = p->leftchild; else p = p->rightchild; }//查询结束 if (p == NULL) { printf("%d not exist\n", key); return 0; } //只有右子树的情况 if (p->leftchild == NULL) { //如果被删除的结点是根结点,那就要修改的是二叉排序树的根 if (parent == NULL) *bt = p->rightchild; //检查是左孩子还是右孩子 else if (parent->leftchild == p) parent->leftchild = p->rightchild; else parent->rightchild = p->rightchild; } //既有左子树也有右子树 if (p->leftchild != NULL) { BSTreeNode parentp; //parentp记录maxpl的父结点 parentp = p; maxpl = p->leftchild; //对称遍历中,右侧的总是大的数 //定位p的左子树中的最大结点maxpl while (maxpl->rightchild != NULL) { parentp = maxpl; maxpl = maxpl->rightchild; } p->data = maxpl->data; //修改p的数据域为maxpl的值 if (parentp == p) //如果maxpl的父结点是p p->leftchild = maxpl->leftchild; //修改p结点的左指针 else parentp->rightchild = maxpl->leftchild; //修改父结点的右指针 p = maxpl; //更新p指针为maxpl结点以便删除 } //释放空间 free(p); return 1; } /****************************************************************/ /* int BSTDelete2(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法2 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete2(BinSearchTree *bt, DataType key) { //parent记录p的父结点,maxpl记录p的左子树中的关键码最大结点 BSTreeNode parent, p, maxpl; p = *bt; parent = NULL; //查找被删除的结点 while (p != NULL) { if (p->data == key) break; //查找到了,跳出循环 parent = p; //注意这一句 if (p->data > key) p = p->leftchild; else p = p->rightchild; }//查找结束 if (p == NULL) { printf("%d not exist!\n", key); return 0; } //只有右子树的情况 if (p->leftchild == NULL) { //删除的是根结点,做特殊处理 if (parent == NULL) *bt = p->rightchild; //p是父结点parent的左孩子,则修改父结点的左指针 else if (parent->leftchild == p) parent->leftchild = p->rightchild; else parent->rightchild = p->rightchild; } //以上和方法1几乎完全相同 //有左子树和右子树 if (p->leftchild != NULL) { maxpl = p->leftchild; //定位左子树中的最大结点maxpl while (maxpl->rightchild != NULL) maxpl = maxpl->rightchild; maxpl->rightchild = p->rightchild; if (parent == NULL) *bt = p->leftchild; //p是父结点parent的左孩子,则修改父结点的左指针 else if (parent->leftchild == p) parent->leftchild = p->leftchild; //p是父结点parent的右孩子,则修改父结点的右指针 else parent->rightchild = p->leftchild; } free(p); //释放结点p return 1; } /****************************************************************/ /* void BST_Destory(BinSearchTree *bt) */ /* 功能:递归销毁二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BST_Destory(BinSearchTree bt) { if (bt) { BST_Destory(bt->leftchild); BST_Destory(bt->rightchild); free(bt); } } ``` 主函数.c文件 main.c ``` #include <stdio.h> #include <stdlib.h> #include "BSTree.h" //用于测试的二叉树先序序列,-1表示空 //40 10 5 -1 -1 -1 55 45 -1 48 47 -1 -1 52 -1 -1 60 -1 70 -1 -1 void main() { BinSearchTree bt; int n = 0; printf("输入二叉排序树的先序序列:\n"); bt = create(); printf("输入要查找的元素,存在返回1,不存在返回0,插入:"); scanf_s("%d", &n); printf("%d\n", BSTSearch(bt, n)->data); printf("输入要插入的元素,成功插入返回1,否则返回0:"); scanf_s("%d", &n); printf("%d\n", BSTInsert(bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); printf("\n第一种删除方法,输入要删除的元素,成功返回1,不成功返回0:"); scanf_s("%d", &n); printf("%d\n", BSTDelete1(&bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); printf("\n第二种删除方法,输入要删除的元素,成功返回1,不成功返回0:"); scanf_s("%d", &n); printf("%d\n", BSTDelete2(&bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); } ``` **问题:**<br> <br> * [0]生成解决方案的时候有警告,但是我忽略了,因为显示程序生成成功了,感觉这几个警告是最大的问题,第4个问题中我详细列出了这些内容<br> <br> * [1]二叉树的递归创建自己感觉有问题,尤其是内存申请这里<br> <br> <code>bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));</code><br> <br> * [2]中序遍历的内容在搜索到左子树底的时候本应返回上一步时会出现异常,建立断点异常内容如下:<br> 引发了异常: 读取访问权限冲突。<br> **ptree** 是 0xCDCDCDCD。<br> <br> * [3]由于中序遍历有异常,所以我注释掉了所有的相关内容,编译时没什么问题,但是删除结点的函数也会出现类似的异常,异常内容如下:<br> 引发了异常: 读取访问权限冲突。<br> **maxpl** 是 0xCDCDCDCD。<br> <br> <br> * [4]好吧,我就都注释掉了,看看别的代码是不是有问题,重新生成解决方案,熟悉的警告出现了,c语言是速成的结构体这块不是很明了,感觉应该是创建二叉搜索树的代码有问题,或者是结构体创建有问题,以下是警告的内容:<br> */bstree.c(24): warning C4047: “=”:“BinSearchTree”与“BSTreeNode *”的间接级别不同<br> */bstree.c(108): warning C4047: “=”:“BSTreeNode”与“BSTreeNode *”的间接级别不同<br> *\bstree.c(139): warning C4047: “=”:“BSTreeNode”与“BinSearchTree *”的间接级别不同<br> *\bstree.c(160): warning C4047: “=”:“BSTreeNode”与“BinSearchTree *”的间接级别不同<br> <br> 第24行:<br> BinSearchTree create()<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));<br> &nbsp;&nbsp;...<br> }<br> <br> 第108行:<br> int BSTInsert(BinSearchTree bt, DataType key)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;//申请结点的内存空间<br> &nbsp;&nbsp;&nbsp;&nbsp;p = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));<br> &nbsp;&nbsp;...<br> }<br> <br> 第139行:<br> void BSTgetMax(BinSearchTree *bt)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;temp = bt;<br> &nbsp;&nbsp;...<br> }<br> <br> 第160行:<br> void BSTgetMin(BinSearchTree *bt)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;temp = bt;<br> &nbsp;&nbsp;...<br> }<br> <br> 以上,求各位大佬指点迷津<br>
C语言写入数据到二进制文件失败
# 相关代码如下 # 我在add()调用lessondatewrite()写进去了 #但是lessondateltater()调用lessondatewrite()没写进去 # 调试结果![图片说明](https://img-ask.csdn.net/upload/201811/02/1541169947_50238.png) #运行结果 英语行的 40 应该变成39 ![图片说明](https://img-ask.csdn.net/upload/201811/02/1541169992_687847.png) ``` typedef struct //定义一个Lesson类型的结构体 { char name[50]; char techer[50]; char location[50]; char time[50]; int number; }LESSON; /*课程结构体参数 课程名 char 50字节 授课老师 char 50字节 位置 char 50字节 开课时间 char 50字节 座位数 int 4字节 结构体大小总计 204字节*/ LESSON lessondatewrite(FILE *fl,LESSON date)//这是一个结构体类型的函数,它可以写入课程数据,接受一个文件指针 { fflush(fl);//刷新缓存区 使将要输入的数据写入硬盘 一次性输入大量数据时使用 避免输入失败 fwrite(&date,sizeof(LESSON),1,fl); } void add()//添加一个课程数据 { FILE *lessondate; LESSON lesson={0};// 声明一个LESSON类型的变量为lesson if((lessondate=fopen("lessondate","rb+"))==NULL)//若文件不存在,则建立文件 { lessondate=fopen("lessondate","wb+"); //rb+打开二进制文本文件,允许读写,若不存在返回空 //wb+新建二进制文本文件,允许读写。如果文件存在则删除文件重建 } printf("请依次输入如下数据,课程名,授课老师,教室位置,开课时间(xx月xx日xx:xx),座位数(各数据以空格隔开,回车结束)\n"); scanf("%s %s %s %s %d",&lesson.name,&lesson.techer,&lesson.location,&lesson.time,&lesson.number); //scanf在接收字符串时 不会接收空白符(空格与回车) 逗号或其他都能接收 //%s不能使用char 而是char[] fseek(lessondate,0L,SEEK_END); lessondatewrite(lessondate,lesson); fclose(lessondate); system("cls"); admin(); } void lessondatelater(int choose) { FILE *lessondate; LESSON lesson={0}; int i; lessondate=fopen("lessondate","rb+"); for(i=0;i<choose;i++) { lesson=lessondateread(lessondate);//给读取函数传递一个文件指针 假定有是三个结构体A B C 循环结束后光标在C前面B后面 } fseek(lessondate,-204L,SEEK_CUR);//后退到上一个结构体 此时光标在B前面 lesson=lessondateread(lessondate);//读取这个结构体数据 读取B的数据 此时光标前进到C前面 lesson.number--;//修改结构体数据 fseek(lessondate,-204L,SEEK_CUR);//后退到上一个结构体 此时光标在B前面 lessondatewrite(lessondate,lesson);//写入修改后结构体数据 覆盖B } ```
两个题目求助,c语言。救救孩子
两个题目求助: (3) 对5个学生建立数据结构,每个学生的数据包括学号、成绩,然后进行相应操作。 程序框架: 1.定义学生结构体,包含两个属性:学号,成绩(选做:加上姓名,成绩用数组做成两门课成绩),给结构体重命名为student; 2.主程序中定义数组stu[5] 3.初始化5个学生的学号、成绩。从自己学号起始的5个同学(成绩随便给); 4.写一个函数将5个学生的数据在屏幕上输出,主程序中调用; 5.写一个函数计算五个同学的平均分,主程序中调用; (4)修改程序(3),全部用指针进行操作,即: 1.同上 2.同上 3.定义指向stu数组的指针sp,用指针完成后续操作
c语言 图书管理程序设计,当对图书信息进行修改时,如若未找到则程序出错
#include <stdio.h> #include <stdlib.h> #include <string.h> //定义一本书 struct book { char name[10]; char writer[10]; char publisher[21]; char price[5]; }; struct Node { //int data; struct book data; struct Node* next; }; //创建表 struct Node* createList() { //结构体变量表示表头 //指针--->变量 动态内存申请 struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); headNode->next = NULL; return headNode; } //创建结点 struct Node* createNode(struct book data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入结点 void insertNodeByHead(struct Node* headNode, struct book data) { struct Node* newNode = createNode(data); //表头法 newNode->next = headNode->next; headNode->next = newNode; } //指定位置删除 void deleteAppoinNode(struct Node* headNode, char* name) { //struct book struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; if (posNode == NULL) { printf("数据为空,无法删除!\n"); return; } //书名是字符串,字符串:strcmp while (strcmp(posNode->data.name,name)) { posFrontNode = posNode; posNode = posFrontNode->next; if (posNode == NULL) { printf("未找到指定位置无法删除!\n"); return; } } //找到了 posFrontNode->next = posNode->next; free(posNode); } //查找功能 struct Node* searchInfoByData(struct Node* headNode, char *name) { struct Node* pMove = headNode->next; if (pMove == NULL) return NULL; while (strcmp(pMove->data.name, name)) { pMove = pMove->next; } return pMove; } //打印 void printList(struct Node* headNode) { struct Node* pMove = headNode->next; //设计到数据的处理 printf("书名\t作者\t出版社\t价格\n"); while (pMove) { printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); pMove = pMove->next; } printf("\n"); } void menu() { //所有操作都同步到文件 printf("-------------【图书信息管理系统】-----------\n"); printf("\t\t1.录入图书信息\n"); printf("\t\t2.浏览图书信息\n"); printf("\t\t3.修改图书信息\n"); printf("\t\t4.删除图书信息\n"); printf("\t\t5.查找图书信息\n"); printf("\t\t0.退出系统\n"); printf("-------------------------------------------\n"); } struct Node* list = createList(); //接收指令 void keyDown() { int choice = 0; struct book data; struct Node* pMove = NULL; scanf("%d", &choice); switch (choice) { case 0: printf("正常退出!\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入图书信息】-----------\n"); //插入链表 printf("请输入书名,作者,出版社,价格:\n"); fflush(stdin); //清空缓冲区 scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); insertNodeByHead(list, data); break; case 2: printf("--------------【浏览图书信息】-----------\n"); printList(list); //打印链表 break; case 3: printf("--------------【修改图书信息】-----------\n"); printf("请输入要修改的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法修改!\n"); system("pause"); } else { printf("请输入图书名,作者,出版社,价格:"); scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); strcpy(pMove->data.name, data.name); strcpy(pMove->data.writer, data.writer); strcpy(pMove->data.publisher, data.publisher); strcpy(pMove->data.price, data.price); } break; case 4: printf("--------------【删除图书信息】-----------\n"); printf("请输入删除的书名:"); scanf("%s", data.name); deleteAppoinNode(list, data.name); break; case 5: printf("--------------【查找图书信息】-----------\n"); printf("请输入要查找的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法删除!\n"); system("pause"); } else { printf("书名\t作者\t出版社\t价格\n"); printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); } break; default: printf("选择错误,重新输入\n"); system("pause"); break; } } int main() { while (1) { menu(); keyDown(); system("pause"); system("cls"); } system("pause"); return 0; }
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
使用 Python 和百度语音识别生成视频字幕
文章目录从视频中提取音频根据静音对音频分段使用百度语音识别获取 Access Token使用 Raw 数据进行合成生成字幕总结 从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFileClip(video_file) video.audio.write_...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
立即提问