c语言如何把链表数据写入文件?

在写一个通讯录管理系统,然后要把联系人的信息结构体放到链表中,然后将链表里的信息写入文件中,下次打开时还能从该文件读出数据。 链表头指针TEL,结构体中有name,tel,style,mail 四项,存入“telephone.txt"中。
我是这样写的
/*退出程序时将数据写回telephone.txt进行更新*/
void ReadBack()
{
FILE *TEL = fopen("telephone.txt","wt+");
ID *te = id->next;

while (te != NULL)
{
    fwrite(id,sizeof(ID),1,TEL);
        te = te->next;
}

fclose(TEL);

}
结果文件中是一串乱字 是 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?f

请给出代码,本人初学,多谢!

1个回答

fwrite 中,每次写的都是id,应该是fwrite(te,sizeof(ID),1,TEL);
另外结构体中name、tel、style、mail都应该是一个buf,这样才会将数据写进去
例如 char name[32];

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言怎么把一个双向链表写入文件
用c语言这一个双向链表,然后用fwrite写入文件,用fread读取,这个过程和单链表是一样的吗?
C语言动态链表写入文件
struct Txl { char name[20]; long long tel; struct Txl *next; }; int n; struct Txl *creat(void) { struct Txl *p1,*p2,*head; n=0; p1=p2=(struct Txl*)malloc(LEN); memset(p1,0,sizeof(LEN)); memset(p2,0,sizeof(LEN)); printf("姓名\t"); scanf("%s",&p1->name); fflush(stdin); printf("电话\t"); scanf("%lld",&p1->tel); fflush(stdin); head=NULL; while(p1->tel!=0) { n=n+1; if(n==1)head=p1; else p2->next=p1; p2=p1; p1=(struct Txl*)malloc(LEN); memset(p1,0,sizeof(LEN)); printf("姓名\t"); scanf("%s",&p1->name); fflush(stdin); printf("电话\t"); scanf("%lld",&p1->tel); fflush(stdin); } p2->next=NULL; return(head); } void prin(struct Txl *head){...}//输出。。。 void save(struct Txl *head) { int i; struct Txl *p; FILE *fp; p=head; if((fp=fopen("1.txt","wb"))==NULL) { printf("不能打开文件"); return; } for(i=0;i<n;i++) { if(fwrite(p,LEN,1,fp)!=1) { printf("写入失败"); } p=p->next; } fclose(fp); } void main(){...}
C语言链表文件题请看看这个有什么问题
``` #include<stdio.h> #include<string.h> #include<stdlib.h> struct stu{ int num; char name[20]; int score; };//定义一个学生信息结构体 struct st{ int num; char name[20]; int score; struct st *next; };//定义一个学生信息链表结点 struct st *top,*rear;//定义链表头尾指针 struct st* push (struct stu x) { struct st *p; p=(struct st*)malloc(sizeof(struct st)); p->num=x.num; strcpy(p->name,x.name); p->score=x.score; p->next=NULL; if(rear==NULL) { rear=top=p; } else{ rear->next=p; rear=p; } return p; }//将结构体元素依次放入链表尾 void sort (struct st *top) { int flag; struct st *q,*s; int temp1,temp3; char temp2[20]; for(q=top->next;q->next!=NULL;q=q->next) { flag=0; s=q->next; if(q->num<s->num) { flag=1; temp1=q->num; q->num=s->num;s->num=temp1; temp3=q->score;q->score=s->score;s->score=temp3; strcpy(temp2,q->name);strcpy(q->name,s->name);strcpy(s->name,temp2); } if(flag==0) break; } }//按照学号从大到小的顺序进行排序节点 int main() { FILE *in,*out; in=fopen("in.txt","r"); out=fopen("out.txt","w");//打开文件 int n,m; struct stu card; scanf("%d",&n); m=n; while(m!=0) { fread(&card,sizeof(struct stu),1,in); if(card.num>0) { m--; push(card); } }//若学号符合要求则连人链表 sort(top); struct st *k; for(k=top;k!=NULL;k=k->next) { fwrite(&card,sizeof(struct stu),1,out); }//写入out文件 fclose(in); fclose(out);//关闭文件 return 0; } ``` 为啥运行后没有反应呢 out文件中没有我想要的数据
C语言,我明明把单链表的某个节点删除了,但单链表写入文件时还是会写入一些奇怪的东西?
![图片说明](https://img-ask.csdn.net/upload/201905/22/1558529936_894535.png) ``` #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct book { long number;//ISBN char name[30];//书名 char auther[30];//作者 char press[30];//出版社 float price;//价格 int exist;//库存 struct book *next; }BOOK; //初始化模块 void Init(BOOK *&b) { b=(BOOK *)malloc(sizeof(BOOK)); //b->exist=0; b->next=NULL; } //查找模块 //按ISBN查找 void Search_number(BOOK *b,long number)//按ISBN查找 { BOOK *p=b->next; while(p) { if(p->number!=number) p=p->next; else break; } if(p&&number==p->number) { printf("您所查找的ISBN为%ld的图书信息如下:\n",number); printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n"); printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); } if(!p) printf("没有找到ISBN为%ld的书籍!\n",number); } //按书名查找 void Search_name(BOOK *b,char *name)//按书名查找 { BOOK *p=b->next; while(p) { if((strcmp(p->name,name)>0||strcmp(p->name,name)<0)) p=p->next; else break; } if(p&&strcmp(p->name,name)==0) { printf("您所查找的书《%s》信息如下:\n",name); printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n"); printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); } else printf("没有找到书名为《%s》的书籍!\n",name); } //图书增加模块 void Add(BOOK *&b) { int flag=0; long number; BOOK *p=b->next,*q=b,*s; printf("\n请输入ISBN:"); scanf("%ld",&number); while(p) { if(p->number==number) { printf("\n您所输入图书已存在,请选择操作:\n"); while(1) { printf("********** 请选择 ****\n"); printf("********** 1.入库 ****\n"); printf("********** 2.退出当前界面 ****\n"); printf("请输入:"); int y; scanf("%d",&y); if(y==1) { printf("\n请输入入库数量:"); int num; while(1) { scanf("%d",&num); if(num<=0) printf("\n输入错误,请重新输入!"); if(num>0) break; } p->exist+=num; printf("入库成功!\n"); break; } else if(y==2) break; else printf("\n输入错误,请重新输入!"); } flag=1; break; } q=p; p=q->next; } if(flag==0) { s=(BOOK *)malloc(sizeof(BOOK)); s->number=number; printf("\n请输入书名:"); scanf("%s",s->name); printf("\n请输入作者名:"); scanf("%s",s->auther); printf("\n请输入出版社名:"); scanf("%s",s->press); printf("\n请输入价格:"); scanf("%f",&s->price); printf("\n请输入入库图书数量:"); scanf("%d",&s->exist); printf("\n"); q->next=s; s->next=NULL; printf("图书增加完成!\n"); } } //图书更新模块 void Update(BOOK *&b) { int flag=0; long number; BOOK *p=b->next,*q=b,*s; printf("\n请输入要更新的图书的ISBN:"); scanf("%ld",&number); while(p) { if(p->number==number) { printf("已找到该图书,请选择操作:\n"); for(int i=0;;i++) { printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf(" ! 请选择 !\n"); printf(" ! 1.价格变更 !\n"); printf(" ! 2.出版社变更 !\n"); printf(" ! 3.库存变更 !\n"); printf(" ! 4.退出当前界面 !\n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf("请输入:"); int k; scanf("%d",&k); if(k==1) { float price; printf("\n请输入更新后的价格:"); scanf("%f",&price); if(price<=0) printf("\n输入错误,请重新输入!\n"); else { p->price=price; printf("图书信息更新成功!\n"); } } else if(k==2) { char press[30]; printf("\n请输入更新后的出版社:"); scanf("%s",press); strcpy(p->press,press); printf("图书信息更新成功!\n"); } else if(k==3) { int exist; printf("\n请输入更新后的库存:"); scanf("%d",&exist); if(exist==0) { q->next=p->next; free(p); } if(exist<0) printf("\n输入错误,请重新输入!\n"); if(exist>0) { p->exist=exist; printf("图书信息更新成功!\n"); } } else if(k==4) break; else printf("\n输入错误,请重新输入!\n"); } flag=1; break; } q=p; p=q->next; } if(flag==0) { printf("查无此书,是否将此书入库(y/n):"); char ch; scanf(" %c",&ch); if(ch=='y') { s=(BOOK *)malloc(sizeof(BOOK)); s->number=number; printf("请输入书名:"); scanf("%s",s->name); printf("\n请输入作者名:"); scanf("%s",s->auther); printf("\n请输入出版社名:"); scanf("%s",s->press); printf("\n请输入价格:"); scanf("%f",&s->price); printf("\n请输入入库图书数量:"); scanf("%d",&s->exist); printf("\n"); s->next=NULL; q->next=s; printf("图书入库完成!\n"); } } } //图书删除模块 void DelBook(BOOK *&b) { long number; printf("\n请输入要删除图书的ISBN:"); scanf("%ld",&number); BOOK *p=b,*q=b->next; while(q)//查找要删除节点 { if(q->number!=number) { p=q; q=p->next; } else break; } if(q&&number==q->number) { int num; printf("该图书当前库存为:%d,请输入要减少的数量:",q->exist); while(1) { scanf("%d",&num); if(num<=0||num>q->exist) printf("输入错误,请再次输入要减少的数量:"); if(0<num&&num<=q->exist) break; } if(q->exist>num) q->exist-=num; else if(q->exist==num) { //if(!q->next) //p->next=NULL; //else p->next=q->next; free(q); } printf("\n删除成功!\n"); } else { printf("没有该图书,无法删除!\n"); return; } } //删除单链表 void Del(BOOK *&b) { BOOK *pre=b,*p=b->next; while(p!=NULL) { free(pre); pre=p; p=pre->next; } free(pre); } //向book.txt写入数据 void WriteBook(BOOK *b) { BOOK *p=b->next; if(!p) { printf("当前链表为空,即将清空文件数据...\n"); /*当链表为空时,以写 的方式清空文件!*/ FILE *fp; fp=fopen("book.txt","w"); fclose(fp); printf("\n文件清空成功!\n"); return; } else { FILE *fp; if((fp=fopen("book.txt","w"))==NULL) { printf("文件打开失败!\n"); return; } fprintf(fp,"ISBN\t书名\t作者\t出版社\t价格\t库存\n"); while(p) { fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("乱码:%d\n",p->number); p=p->next; } //fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("书籍存储成功!\n"); fclose(fp); } } //从book.txt读取图书信息 BOOK *ReadBook() { FILE *fp; BOOK *head,*p,*q; Init(head); if((fp=fopen("book.txt","r"))==NULL) { printf("文件打开失败!\n"); return head; } else { fgetc(fp); if(!feof(fp)) { char str[1000]; rewind(fp); fgets(str,sizeof(str),fp); //printf("\n%s\n",str); p=(BOOK *)malloc(sizeof(BOOK)); fscanf(fp,"%ld%s%s%s%f%d",&p->number,p->name,p->auther,p->press,&p->price,&p->exist); p->next=NULL; head->next=p; } while(!feof(fp)) { q=(BOOK *)malloc(sizeof(BOOK)); fscanf(fp,"%ld%s%s%s%f%d",&q->number,q->name,q->auther,q->press,&q->price,&q->exist); q->next=NULL; p->next=q; p=p->next; //q->next=NULL; } printf("\n书籍信息获取成功!\n"); fclose(fp); return head; } } //菜单 void menu(BOOK *&b) { while(1) { int x,y; printf(" 小型书店图书信息管理系统 \n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf(" ! 主菜单 !\n"); printf(" ! 1.查询图书信息 !\n"); printf(" ! 2.图书信息增加 !\n"); printf(" ! 3.图书信息更新 !\n"); printf(" ! 4.图书信息删除 !\n"); printf(" ! 5.退出程序 !\n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf("请输入:"); scanf("%d",&x); if(x==1) { printf("\n请输入查找方法\n"); printf("1.按ISBN查找\n2.按书名查找\n"); printf("请输入:"); scanf("%d",&y); if(y==1) { long number; printf("请输入要查找书籍的ISBN:"); scanf("%ld",&number); Search_number(b,number); } else if(y==2) { char *name; printf("请输入要查找书籍的书名:"); scanf("%s",name); Search_name(b,name); } else printf("输入错误!\n"); } else if(x==2) Add(b); else if(x==3) Update(b); else if(x==4) DelBook(b); else if(x==5) return; else printf("\n输入错误,请重新输入!\n"); } } //主函数 int main() { BOOK *b; b=ReadBook(); menu(b); WriteBook(b); Del(b); return 0; } ```
关于c语言文件的读取和修改
直接从文件中读取到屏幕 查询 修改 和把文件以链表的形式写入内存在查询 读取 修改 哪个效率高呢? 把文件写入到链表也需要时间吧
C语言中的链表赋值问题
我写了一个存储电影名字以及评级的链表,不理解其中以下三点 1.prev->next=current, 2.prev=current, 3.current=current->next 我目前的理解是:1.把current这个结构体指针变量的地址赋值给prev中的结构体指针变量next;2.把current这个结构体指针变量的地址赋值给结构体指针变量prev;3.令结构体指针变量current的值等于结构体指针变量next的值 不知道对吗? 以下是我的源代码: #include<stdio.h> #include<stdlib.h> //malloc();原型 #include<string.h> //strcpy();原型 #define SIZE 20 //最大字数 typedef struct film { char title[SIZE]; int rating; struct film * next; }Film; int main() { Film *head=NULL; Film *prev,*current; char title2[SIZE]; //写入 puts("Scan first title(0-20 charecter)"); while(gets(title2)!=EOF&&title2[0]!='\0') { current = (Film *)malloc(sizeof(Film)); //存第一个指针head if(head==NULL) { head=current; } //current's address 赋给next else prev->next=current; strcpy(current->title,title2); puts("Rating is...(0-10)"); scanf("%d",&current->rating); getchar(); //节点更换 puts("Enter next movie title"); prev=current; } //显示 if(head) { current=head; while(current!=NULL) { printf("the title is %s,the rating is %d\n",current->title,current->rating); current=current->next; //把下一个结构体指针的地址给current } } else puts("Not find any dota..."); //清内存 current=head; while(current) { free(current); current=current->next; } puts("OK!"); return 0; } 十分感谢
修改程序:信源编解码(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语言解答,单链表实现
假设某超市销售有m种商品(假设商品的编号为1,2,3,……,m),有n台前台收款机(假设收款机的编号为1,2,3,……,n)进行收款。每次收款以记录的形式提供给计算机,每个记录表示某台收款机的一种商品一次交易的数量和销售额。记录由4个域组成:收款机编号、商品编号、销售数量、销售金额。构造一个结构体类型,每次销售数据以一个结构体变量保存在一个数据文件中。系统要求实现结构体数据写入文件,分别构建以收款机和商品为单位的数据分类函数,统计销售总额,构建单链表等功能。
文件读写失败,求问哪里出了错?
(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件, 且会弹出“Debug error”的框,求问哪里出错了,谢谢 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) 点击忽略以后不影响程序运行 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) 可以输入信息,且写入了文件 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) 但关闭文件后,再次运行程序,显示如下 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242899_516963.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png) 无法读取之前写入的信息,程序也无法 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //创建学生信息结构体 struct student { char ID[20]; //学号 char name[20]; //姓名 int math; //高数成绩 int english; //英语成绩 int eletric; //电路成绩 int c_program; //C语言成绩 float sum; //总分 float aver; //平均分 }; //链式管理系统 struct Node { struct student data; struct Node* next; }; //创建表头,表示整个链表 struct Node* CreateList() { struct Node* head = (struct Node*)malloc(sizeof(struct Node)); head->next = NULL; return head; } //创建结点 struct Node* CreateNode(struct student data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入操作 void insertNode(struct Node* head, struct student data) { //创建插入结点 struct Node* newNode = CreateNode(data); newNode->next = head->next; head->next = newNode; } //删除操作 void deleteNode(struct Node* head, char *pID) { struct Node* cur, * prev; for (cur = head, prev = NULL;cur != NULL && strcmp(cur->data.ID, pID) != 0;prev = cur, cur = cur->next); if (cur == NULL) { printf("未找到相关数据\n"); system("pause"); return; } if (prev == NULL) head = head->next; else prev->next = cur->next; free(cur); return; } //打印操作 void printList(struct Node* head) { //从第二个结点开始打印 struct Node* p = head->next; printf("学号\t姓名\t高数\t英语\t电路\tC语言\t总分\t平均分\n"); while (p) { printf("%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } printf("\n"); } //按照平均分进行排序(冒泡排序法) void sort(struct Node* head) { struct Node* p, * pstart, * pend, * temp, * pre; p = head->next; pend = head; pstart = (struct Node*)malloc(sizeof(struct Node)); pstart->next = head; while (p != NULL) { temp = pstart->next, pre = pstart; while (temp != p && p->data.aver >= temp->data.aver) { temp = temp->next; pre = pre->next; } if (temp == p) pend = p; else { pend->next = p->next; p->next = temp; pre->next = p; } p = pend->next; } head = pstart->next; free(pstart); return; } //链表的文件操作 //链表的读文件操作 void readInfo(struct Node* head, char* fileName) { FILE* read = fopen(fileName, "r"); if (read == NULL) read = fopen(fileName, "w+"); struct student data; while (fscanf(read, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", data.ID, data.name, data.math, data.english, data.eletric, data.c_program, data.sum, data.aver) != EOF) insertNode(head, data); fclose(read); } //链表的写文件操作 void writeInfo(struct Node* head, char *fileName) { FILE* write = fopen(fileName, "w"); struct Node* p = head->next; while (p) { fprintf(write, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } fclose(write); } //菜单项目 void menu() { printf("--------------学生成绩管理系统------------------\n"); printf("\t\t0.退出系统\n"); printf("\t\t1.录入信息\n"); printf("\t\t2.浏览信息\n"); printf("\t\t3.删除信息\n"); printf("\t\t4.修改信息\n"); printf("\t\t5.成绩排序\n"); printf("------------------------------------------------\n"); } struct Node* studentList = CreateList(); //按键交互 void keydown() { int userkey = 0; printf("请输入指令的相应序号:\n"); scanf("%d", &userkey); struct student userData; switch (userkey) { case 0: printf("--------------【退出系统】---------------\n"); printf("正常退出\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入信息】---------------\n"); printf("请输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); break; case 2: printf("--------------【浏览信息】---------------\n"); printList(studentList); break; case 3: printf("--------------【删除信息】---------------\n"); printf("请输入需要删除的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); break; case 4: printf("--------------【修改信息】---------------\n"); printf("请输入需要修改的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); printf("请重新输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); printf("修改成功!\n"); break; case 5: printf("--------------【成绩排序】---------------\n"); sort(studentList); printList(studentList); break; default:printf("输入错误,请重新输入\n"); break; } } int main() { readInfo(studentList, "studentInfo.txt"); while (1) { menu(); keydown(); writeInfo(studentList, "studentInfo.txt"); system("pause"); system("cls"); } system("pause"); return 0; } ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png)
c语言 打印不出来?文件用得对吗
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define max 100 //定义全局变量 int isEmpty=0;//标志,判断链表是否为空 //!!!定义单链表结构体!!! <货物类型> typedef struct Node{ char NAME[100];//各类型名称 int NUM; //各类型下的货物总数 struct Node*next; }Node; // 定义单个货物 typedef struct Goods{ char name[100];//货物名称 double price;//货物价格 int num;//货物库存 int id;//所属类型的id }Goods; //函数声明 void Create_File_List(); //创建文件 void add_kinds();//将种类信息录入文件中 Node*CreateList();//创建链表(将信息放到链表中) void Print_List(Node*head);//打印链表 //主函数 void main() { int x; Node *head; if(!(head=(Node *)malloc(sizeof(Node)))) //分配空间 { printf("\n"); exit(1); } Create_File_List();//创建文件 printf("欢迎使用我的仓库管理系统!\n"); while(1) { //主菜单开始 printf("==========================\n"); printf("1.显示货物类型列表\n"); printf("2.增加货物类型\n"); printf("3.删除货物类型\n"); printf("4.货物入库\n"); printf("5.货物出库\n"); printf("6.库存显示\n"); printf("7.退出\n"); printf("==========================\n"); //主菜单结束 printf("选择1-7:"); scanf("%d",&x); switch(x) { case 1:Print_List(head);break; case 2:add_kinds(); CreateList(); break; case 3:printf("******请输入要删除货物类型的编号:******\n"); break; case 4:;break; case 5:;break; case 6:;break; case 7:printf("bye!see you next time!\n"); exit(0); break; default:printf("input error!\nplaese input1-7"); } } } //函数 //创建文件是否成功 void Create_File_List() { FILE *fp;//需要在每个函数写这句吗 if ((fp = fopen("storehouse.txt","r"))==NULL) /*如果此文件不存在*/ { if ((fp = fopen("student.txt","w"))==NULL) { printf( "无法建立文件!"); } } } //录入货物信息到文件中 void add_kinds() { FILE*fp; struct Node Node; fp = fopen("storehouse.txt","a+"); Create_File_List(); printf("请输入货物名称:"); scanf("%s",&Node.NAME); printf("请输入货物总数:"); scanf("%d",&Node.NUM); fwrite(&Node,sizeof(Node),1,fp);//这两个fwrite有区别吗 fclose(fp); } //从已经写入的文件中读到链表中(函数功能:创建链表) Node*CreateList() { Node*p,*head,*q;//p指针总是指向新申请的节点,q总是指向尾节点 p=(Node*)malloc(sizeof(Node)); head=p;//开辟头/尾节点内存 (头结点没有信息) q=p; q->next=NULL;//标志链表的结束 FILE*fp; fp=fopen("storehouse.txt","r"); struct Node Node; while(fread(&Node,sizeof(Node),1,fp)!=0)//从文件中读结构块体 { //p=(Node*)malloc(sizeof(Node)); strcpy(p->NAME,Node.NAME); p->NUM=Node.NUM; //下面两句没看懂 q->next=p;//把新节点挂到尾节点后 q=q->next;//q指针指向新的尾节点 //第二句不就是q=p吗? } q->next=NULL;//标志链表的结束 fclose(fp); return head; } //从链表中输出打印到屏幕中数据(输出链表) void Print_List(Node*head) { Node*p; p=head->next;//跳过无数据的头结点 while(p!=NULL) { printf("%s",p->NAME); printf("%d",p->NUM); p=p->next;//指向下一个节点 } } ![图片说明](https://img-ask.csdn.net/upload/201806/01/1527846937_495816.png)
求救帮忙看一下我这个用C语言写的顺序线性表线性表合并为什么会有warning C4020: ?一直找不到原因
调试环境VC6.0 ``` #include<stdlib.h> #include<stdio.h> typedef int Status; // Status 是函数返回值类型,其值是函数结果状态代码。 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define List_Init_Size 100 //线性表存储空间初始分配量 #define Listincerment 10 //线性表存储空间的分配增量 typedef struct SqList { int *elem; int length; int listsize; //当前分配的存储容量() }SqList; Status InitList_Sq(SqList*L) {//初始化顺序线性表// L->elem=(int*)malloc(List_Init_Size*sizeof(int)); if(!L->elem)exit(OVERFLOW); //存储分配失败 L->length=0; return OK; } Status GetElem(SqList a,int i,int*e) { //读取元素 if(i<0||i>a.length) return ERROR; e=&a.elem[i-1]; //i-1存储第i个元素 return OK; } int ListLength(SqList L) { //计算长度 if(!L.elem)exit(ERROR); return L.length; } Status ListInsert_Sq(SqList *L, int i, int e) { //i位置之前插入新元素e if(i<1||i>L->length+1)return ERROR; if((L->length)>=(L->listsize)){ //当前存储空间已满,增加分配 int*newbase,*q,*p; newbase=(int*)realloc(L->elem,(L->listsize+Listincerment)*sizeof(int)); if(!newbase)exit(OVERFLOW);//存储分配失败} L->elem=newbase; //新的基址 L->listsize+=Listincerment; //增加容器容量 q=&(L->elem[i-1]); //q为插入位置 for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; //插入位置及以后的元素后移 *q=e; //插入e ++L->length; } return OK;} void MergeList(SqList La,SqList Lb,SqList*Lc) { //线性表La和Lb中的数据元素按照值非递减排列。 int i,j,k,ai,bj; InitList_Sq(Lc); i=j=1;k=0; La.length=ListLength(La); Lb.length=ListLength(Lb); while((i<=La.length)&&(j<=Lb.length)) { GetElem(La,i,&ai); GetElem(Lb,j,&bj); if(ai<=bj) { ListInsert_Sq(Lc,++k,ai); ++i;} else{ListInsert_Sq(Lc,++k,bj);++j;} } while(i<=La.length) { GetElem(La,i,&ai); i++; ++k; InitList_Sq(Lc,k,&ai);} while(j<=Lb.length) { GetElem(Lb,j,&bj);j++; ++k; InitList_Sq(Lc,k,&bj); } } void output(SqList L) { int i; for(i=0;i<L.length;i++) { printf("%d ",L.elem[i]); } } void main() { SqList a,b,c; int i,j,k; InitList_Sq(&a); InitList_Sq(&b); printf("输入要写入链表a中元素的个数"); scanf("%d",&j); printf("输入每个元素"); for(i=1;i<=j;i++) { int e; scanf("%d",&e); ListInsert_Sq(&a,i,e); } printf("输入要写入链表b中元素的个数\n"); scanf("%d",&k); printf("输入每个元素"); for(j=1;j<=k;i++) { int e; scanf("%d",&e); ListInsert_Sq(&b,i,e); } MergeList(a,b,&c); output(c); } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575268330_217932.png)
C语言读取文件出现疑似C盘路径的东西..
发生如下错误 ![图片说明](https://img-ask.csdn.net/upload/201606/04/1465045260_137756.jpg) 以下是部分源代码。。期末的图书管理系统的大作业的= = typedef struct book { char AN[10]; /*登录号*/ char name[20]; /*书名*/ char author[20]; /*作者名*/ char clc[10]; /*分类名*/ char company[20]; /*出版单位*/ char date[20]; /*出版日期*/ char price[10]; /*价格*/ struct book *next; }Booklist,*Pointer; int num=0;//全局变量的定义 Pointer Head=NULL;//头指针为空 FILE *fp;//指向文件的指针 void Read()/*读入文本文件的函数*/ {Pointer p,q; int m=0; char file[20]; printf("请输入文件路径及文件名:"); scanf("%s",file); if((fp=fopen(file,"r+"))==NULL) { printf("不能打开文件!\n"); return; } m=m+1; if(m==1) { p=(Pointer)malloc(sizeof(Booklist)); Head=p;//将p的地址赋给头指针Head fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",&p->AN,&p->name,&p->author,&p->clc,&p->company,&p->date,&p->price); do {num=num+1;//记录书籍信息量 if(num==1) //区别开链表开头与中间的处理方法 Head->next=p; else q->next=p; q=p; p=(Pointer)malloc(sizeof(Booklist)); fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",&p->AN,&p->name,&p->author,&p->clc,&p->company,&p->date,&p->price);//读入文件数据 }while(!feof(fp));//检查文件是否结束,若是则停止读入,否则继续读入 q->next=p; p->next=NULL;//链表结尾处理 num=num+1; } printf("写入数据成功,可返回浏览其信息。"); fclose(fp); return; } void Scan(Pointer Head) //显示图书信息函数 { Pointer p; p=Head; if(p==NULL) printf("记录为空");//检测是否有图书信息 else { printf("\n\t共有%d条记录",num); while(p!=NULL) { printf("\n\n\t\t登录号:%-10s",p->AN);//显示图书信息 printf("\n\t\t书名: %-20s",p->name); printf("\n\t\t作者名: %-20s",p->author); printf("\n\t\t分类号: %-10s",p->clc); printf("\n\t\t出版单位:%-20s",p->company); printf("\n\t\t出版时间:%-20s",p->date); printf("\n\t\t价格: ¥%-10s",p->price); p=p->next; } printf("\n\t\t请按任意键回到主菜单"); return; } }
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语言写的顺序表存储的有序表的的合并没有警告也没有错误但是无法输出呢?
``` #include<stdlib.h> #include<stdio.h> //长度与空间是检测 typedef int Status; // Status 是函数返回值类型,其值是函数结果状态代码。 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define List_Init_Size 10 //线性表存储空间初始分配量 #define Listincerment 10 //线性表存储空间的分配增量 typedef struct SqList { int *elem; int length; int listsize; //当前分配的存储容量() }SqList; Status InitList(SqList*L) {//初始化顺序线性表// L->elem=(int*)malloc(List_Init_Size*sizeof(int)); if(!L->elem)exit(OVERFLOW); //存储分配失败 L->length=0; L->listsize=List_Init_Size; return OK; } Status GetElem(SqList a,int i,int*e) { //读取元素 if(i<0||i>a.length) return ERROR;//在表内 e=&a.elem[i-1]; //i-1存储第i个元素 return OK; } int ListLength(SqList L) { //计算长度 if(!L.elem)exit(ERROR); //空间存在 return L.length; } Status ListInsert(SqList *L, int i, int e) { //i位置之前。。。插入新元素e if(i<1||i>L->length+1)return ERROR; //在表内 if((L->length)>=(L->listsize)){ //当前存储空间已满,增加分配 int*newbase,*q,*p; newbase=(int*)realloc(L->elem,(L->listsize+Listincerment)*sizeof(int)); if(!newbase)exit(OVERFLOW);//存储分配失败} L->elem=newbase; //新的基址 L->listsize+=Listincerment; //增加容器容量 q=&(L->elem[i-1]); //q为插入位置 for(p=&(L->elem[L->length-1]);p>=q;--p) //实质为数组,所以下标注意。 *(p+1)=*p; //插入位置及以后的元素后移 ,副本的覆盖。 *q=e; //插入e ++L->length; } return OK;} void output(SqList L) { int i; for(i=0;i<L.length;i++) { printf("%d ",L.elem[i]); } } void MergeList(SqList LA, SqList LB, SqList *LC) //顺序有序表的合并 { //归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排列 int *pa, *pb, *pc, *pa_last, *pb_last; pa = LA.elem; pb = LB.elem; //指针pa和pb的初值分别指向两个表的第一次元素 LC->listsize=LC->length = LA.length + LB.length; //新表长度为待合并两表的长度之和 LC->elem = (int*)malloc(LC->listsize*sizeof(int)); //为合并后的新表分配一个数组空间 pc = LC->elem; //指针pc指向新表的第一个元素 pa_last = LA.elem + LA.length - 1; //指针pa_last指向LA表的最后一个元素 pb_last = LB.elem + LB.length - 1; //指针pb_last指向LB表的最后一个元素 while (pa <= pa_last && pb <= pb_last) //两个表都非空 { if (*pa <= *pb) //依次“摘取”两表中值较小的结点插入到LC表的最后 *pc++ = *pa++; else *pc++ = *pb++; } while (pa <= pa_last) //LB已到达表尾,依次将LA的剩余元素插入LC表的最后 *pc++ = *pa++; while (pb <= pb_last) //LA已到达表尾,依次将LB的剩余元素插入LC表的最后 *pc++ = *pb++; } void main() { SqList a,b,c; int i,j,k; InitList(&a); InitList(&b); printf("输入要写入链表a中元素的个数\n"); scanf("%d",&j); printf("输入每个元素"); for(i=1;i<=j;i++) { int e; scanf("%d",&e); ListInsert(&a,i,e); } printf("输入要写入链表b中元素的个数\n"); scanf("%d",&k); printf("输入每个元素"); for(j=1;j<=k;i++) { int e; scanf("%d",&e); ListInsert(&b,i,e); } MergeList(a,b,&c); output(c); } ```
请问为什么我写的C语言中顺序存储的线性表的输出有这个错误
调试环境VC6.0 ``` #include<stdlib.h> #include<stdio.h> typedef int Status; // Status 是函数返回值类型,其值是函数结果状态代码。 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define List_Init_Size 100 //线性表存储空间初始分配量 #define Listincerment 10 //线性表存储空间的分配增量 typedef struct SqList { int *elem; int length; int listsize; //当前分配的存储容量() }SqList; Status InitList_Sq(SqList*L) {//初始化顺序线性表// L->elem=(int*)malloc(List_Init_Size*sizeof(int)); if(!L->elem)exit(OVERFLOW); //存储分配失败 L->length=0; return OK; } Status ListInsert_Sq(SqList *L, int i, int e) { //i位置之前插入新元素e if(i<1||i>L->length+1)return ERROR; if((L->length)>=(L->listsize)){ //当前存储空间已满,增加分配 int*newbase,*q,*p; newbase=(int*)realloc(L->elem,(L->listsize+Listincerment)*sizeof(int)); if(!newbase)exit(OVERFLOW);//存储分配失败} L->elem=newbase; //新的基址 L->listsize+=Listincerment; //增加容器容量 q=&(L->elem[i-1]); //q为插入位置 for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; //插入位置及以后的元素后移 *q=e; //插入e ++L->length; } return OK;} void output(SqList L) { int i; for(i=0;i<L.length;i++) { printf("%d ",&L.elem[i]); } } void main() { SqList a; int i,j; InitList_Sq(&a); printf("输入要写入链表a中元素的个数"); scanf("%d",&j); printf("输入每个元素"); for(i=1;i<=j;i++) //小于等于 { int e; scanf("%d",&e); ListInsert_Sq(&a,i,e); } output(a); } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575260361_988221.png)
c语言使用malloc导致程序退出,问题zai第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
求大侠帮忙:C语言程序设计---编程题(以下所有题目程序应是非递归的)
1. 编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2. 2. 学校工会组织活动,要求有8名教师参加,这8名教师将分别从A学院3名教师、B学院5名教师、C学院6名教师中任意抽取,且其中必须有B学院的教师参加,请编程输出所有可能的方案 3. 已知在C盘根目录下存有文本文件“file1.txt”,编程统计文件“file1.txt”中每个字母字符和每个数字字符出现的频率,在屏幕上显示统计结果,并将统计结果写入磁盘文件“file2.txt”中 4. 输入一个字符串,内有数字和非数字字符,如:AS234fgh456d 17968x7654,将其中连续的数字作为一个整体,依次存放到一数组a中,例如234存入a[0],456存入a[1],…,编程统计其共有多少个整数,并输出这些数。要求: 1) 编写函数完成将字符串中连续的数字作为一个整体,依次存放到一数组a中 2) 在主函数中完成数据的输入与结果的输出 5. 按由大到小的顺序对一个含有N个整型数据的数组A[N]进行排序,利用如下改进的选择排序方法:第一次选出最大者存入A[1],第二次选出最小者存入A[N],第三次选出次大者存入A[2],第四次选出次小者存入A[N-1],如此大小交替地选择,直到排序完成。要求: 1) 编写函数sort完成排序 2) 在主函数中完成数据的输入与结果的输出 6. 已知用两个单链表分别存储的两个字符串,均按递增次序排列。编程实现将这两个单链表归并为一个按数据域值递减次序排列的单链表。要求: 1) 单链表中每个结点只存放一个字符 2) 利用原链表中的结点空间存储归并后的单链表,不另外生成新链表 3) 单链表的建立写一函数create实现 4) 两个链表归并过程写一函数sub实现 5) 输出结果写一函数output实现 6) 主函数调用这三个函数完成程序功能
c语言使用malloc导致程序退出,问题在第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问