求大神~~ c free()结构体指针出错 25C

本人菜鸟一枚,调试程序时发现下面的程序只要用free()来释放结构体指针就出错,百思不得其解,望大师指正!非常感谢啦!
注:本人用的是VC6.0。自己写的C程序,私心揣测难道是结构体指针特殊一点,或者我释放的方式不对~
补充:C-Free 5.0上选择mingw5调试则没有问题!到底哪里有问题?
图片说明

#include <stdio.h> 
#include <stdlib.h>
#include <malloc.h> 

struct Particle{
     int age;
     double money;
     double famly[4];
     };//定义一个结构体变量 


int main()
{    int PM=5,i,j;
     double *ptr=(double *)calloc(PM,sizeof(double)); 
     struct Particle *swarm=(struct Particle *)calloc(PM,sizeof(struct Particle)); 

     if(swarm==NULL)
     {printf("给swarm申请内存失败!\n");
     exit(1);//异常退出
     }
     else printf("给swarm申请内存成功!\n");

     for(i=0;i<PM;i++,swarm++) //对结构体指针赋值并输出
     {
     swarm->age=2*i;
     swarm->money=3*i+0.55;
       printf("swarm[%d]: age=%d,money=%lf ",i,swarm->age,swarm->money);
     for(j=0;j<4;j++)
        {swarm->famly[j]=1.5*j;printf("%lf ,",swarm->famly[j]);}
     printf("\n");
     }

       printf("\n");//对double型数组赋值并输出
     for(i=0;i<PM;i++)
     printf("%lf\n",ptr[i]+i*0.5);
     printf("\n");

     free(ptr);ptr=0;
     //free(swarm);swarm=NULL;  
     //为什么上面语句一添加程序运行就出问题呢??!!而free(ptr)就没问题? 

     printf("\n\n"); 

} 

4个回答

哈哈,我已经解决了!问题果然出在指针上!由于这个语句的存在:
for(i=0;i<PM;i++,swarm++) //对结构体指针赋值并输出
因此,一些列操作后,swarm指向的内存已经不再是定义时分配的内存了(大意如此,我可能表达的不太准确),因此直接free()的话就要出错了。
此时,先要将swarm还原,再free: swarm=swarm-PM;free(swarm);swarm=NULL;
更改后就OK啦!
指针ptr之所以不存在这个问题,是因为ptr类似数组名,指向的内存定义后就固定不变,所以可以直接free().
事实上,我也是用ptr去指代一个double型的数组,用指针的优点是这个数组的大小可以用一个变量num来灵活调整。
此处的swarm我认为是一个结构体数组的指针,(swarm+i)相当于将swarm从定义的位置移动了i的某个整数倍,
指向了结构体数组中的下一个成员的地址。

我试了你的代码,没问题啊。。。

你直接运行时没有问题,你把//free(swarm);swarm=NULL; 语句前面的\删除了再试试看,我的在vc6.0下运行后报错。

qq_20334059
彼岸花的妩媚 好吧,我不是在VC环境下运行的,按道理来讲,就算指针指向的地址变了,释放的话,应该也没问题的才对吧。。。。
大约 4 年之前 回复

恩,没关系。前几天出了个苦头,C-Free 5 mingw5环境下辛辛苦苦调试通过的程序,准备生成可执行文件时拿到vc6.0下一运行,一堆错误!
感觉vc6.0对代码的要求比较苛刻。还有就是,C的指针用起来真的要小心,要多看理论,否则太容易出错了~
谢谢啦!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于结构体指针与结构体数组

目前开发遇到一个问题,有一个动态库dll,需要传进去一个结构体数组,函数为 opt_api_init(InfoInitMarket* InitMarketInfo); 这个是结构体 typedef struct tagInfoInitMarket { char commID[COMMODITY_ID + 1]; //合约编码 char classID[CLASS_ID + 1]; //品种代码 char instrumentType; //合约类型:期货:F,看涨期权:C,看跌期权:P double tick; //最小变动价位 long lastTradeDate; } 然后我要在数据库里查询到这些数据,传入结构体数组,数组数目不确定,再调用那个函数。请问我应该怎么来实现。我是这样写的 tagInfoInitMarket *m_pInfoinit; while(pdb->more()) //遍历查询出来的数据 { m_pInfoinit = new struct tagInfoInitMarket; memset(m_pInfoinit,0,sizeof(m_pInfoinit)); strcpy(m_pInfoinit->commID,pDB->Get("QQDM").c_str(),sizeof(m_pInfoinit->commID)); strcpy(m_pInfoinit->classID,pDB->Get("DMQZ").c_str(),sizeof(m_pInfoinit->classID)); } 这样写对吗?那我要怎么样遍历结构体数组啊?或者有没有其他办法,拜托各位大神了!

将指向结构体对象的指针作为函数参数,调用p->时调试报错

void deleteelement(linearlist *list, int power) { linearlist *p = list; while (p->power != power && p->next != NULL) //调试时显示错误在这一行 { p = p->next; } if (p->power == power) { linearlist *dele = p; p = p->precursor; p->next = dele->next; p = dele->next; p->precursor = dele->precursor; free(dele); } else cout << "不存在这个元素!" << " "; } //如上文,这个函数用于删除线性表中的一项,在调用函数时编译通过但调试出错,报错为 [下面的框架可能不正确和/或缺失,没有为 kernel32.dll 加载符号] 我觉得可能是指针传递不正确从而不能正确的使用p->next,但是有不懂应该怎么写,求大神解答

C语言指针内存分配相关问题,求大神指导。。。

这里有两段程序,基本上是一样的。都是使用链表来实现队列。这里实现了出队和入队操作。第一段程序能够正确执行,但是第二段程序不可以,原因是rear和front总是相同的,所以输出的都是-1。我检查了一下,发现每一次rear改变会是的front同时改变。这是为什么?第一段程序通过一个结构体传递rear和front确可以,这是为什么?是通过结构体构建了二级指针吗?求大牛。。。我都快绕晕了,好几次遇到这个问题了。。。 能够正确执行的程序: ``` #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node; typedef struct Q { Node *front; Node *rear; }Q; void push(Q*q, int e) { Node *node = (Node*)malloc(sizeof(Node)); //分配空间 node->data = e; //数据域 node->next = NULL; //指针域 q->rear->next = node; //添加到末尾 q->rear = node; //更新尾指针 } int pop(Q* q) { if (q->front == q->rear) return -1; Node *t = q->front->next; //获取队首元素 int e = t->data; //获取队首数据域 q->front->next = t->next; //更新队首指针 if (t == q->front) //如果队首与队尾相同,则将队尾指针指向队首 q->rear = q->front; free(t); //释放 return e; //返回队首数据域 } int main() { Q queue; queue.rear = (Node*)malloc(sizeof(Node)); queue.front = queue.rear; push(&queue, 1); push(&queue, 2); push(&queue, 3); int k = pop(&queue); printf("%d\n", k); k = pop(&queue); printf("%d\n", k); k = pop(&queue); printf("%d\n", k); return 0; } ``` 不能够正确执行的: ``` #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node; void push(Node* rear, int e) { Node *node = (Node*)malloc(sizeof(Node)); //分配空间 node->data = e; //数据域 node->next = NULL; //指针域 rear->next = node; //添加到末尾 rear = node; //更新尾指针 } int pop(Node* rear, Node* front) { if (front == rear) return -1; Node *t = front->next; //获取队首元素 int e = t->data; //获取队首数据域 front->next = t->next; //更新队首指针 if (t == front) //如果队首与队尾相同,则将队尾指针指向队首 rear = front; free(t); //释放 return e; //返回队首数据域 } int main() { Node *rear = (Node*)malloc(sizeof(Node)); Node *front = rear; push(rear, 1); push(rear, 2); push(rear, 3); int k = pop(rear,front); printf("%d\n", k); k = pop(rear, front); printf("%d\n", k); k = pop(rear, front); printf("%d\n", k); return 0; } ```

关于一个单词匹配的题目,得不到想要的结果,贴出源程序,求大神帮忙~~~

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<windows.h> int IsOneCharDifferent(char array[255]); int IsIt(char array[255]); int IsMoreOrLessOneChar(char array[255]); //************************************************************************************* //创建结构体链表保存每个单词的序号、长度、以及链表所需的指针。即字典表的单词数目无限。 //************************************************************************************* typedef struct letters { char letter[255]; int num; int lenth; struct letters *next; }NODE; NODE *head; NODE *p; //********************************************************************************************** //load函数读取系统文件 //********************************************************************************************** void load() { FILE * fp; fp=fopen("c:\\Big Scary\\课程设计\\2_单词匹配\\letters.txt","r"); if((fp=fopen("c:\\Big Scary\\课程设计\\2_单词匹配\\output.txt","r"))==NULL) { printf("不能打开文件\n"); return; } NODE *head; head=(NODE *)malloc(sizeof(NODE)); NODE *p; head->next=NULL; while(!feof(fp)) { p=(NODE *)malloc(sizeof(NODE)); fscanf(fp,"%s",&p->letter); fscanf(fp,"%d",&p->num); fscanf(fp,"%d",&p->lenth); if(feof(fp)) { free(p); break; } p->next=head->next; head->next=p; } fclose(fp); } //********************************************************************************************** //int IsOneCharDifferent(char array[255])函数找出与输入单词相差一个字母的单词序号。并赋值给Ei。 //********************************************************************************************** int IsOneCharDifferent(char array[255]) { load(); int num=0; int len=strlen(array); NODE *ps=p; for(;ps->next!=0;ps=ps->next) { if(p->lenth!=len) { return 0; } for(int c=0;c<p->lenth;c++) if(p->letter!=array) { num++; if(num>1) return 0; else return p->num; } } return 0; } //************************************************************************************************* //int IsMoreOrLessOneChar(char array[255])函数找出与输入单词多或者少一个字母的单词序号。并赋值给Fi。 //************************************************************************************************* int IsMoreOrLessOneChar(char array[255]) { load(); int len=strlen(array); NODE *ps=p; for(;ps->next!=0;ps=ps->next) { if(p->lenth!=len) { return 0; } else if(p->lenth-len==1||len-p->lenth==1) { return(p->num); } else return 0; } return 0; } //********************************************************************************************** //int IsIt(char array[255])函数找出与输入单词完全相同的单词序号。并赋值给i。 //********************************************************************************************** int IsIt(char array[255]) { load(); int len=strlen(array); NODE *ps=p; for(;ps->next!=0;ps=ps->next) { if(p->lenth!=len) { return 0; } if(strcmp(array,p->letter)==0) { return(p->num); } else return 0; } return 0; } //******************************************************************* //CharPiPei()函数进行单词匹配操作。 //******************************************************************* void CharPiPeiSave() { char array[255]; printf("请随意输入一个单词:\n"); fflush(stdin); gets(array); IsIt(array); IsOneCharDifferent(array); IsMoreOrLessOneChar(array); FILE * fp; fp=fopen("c:\\Big Scary\\课程设计\\2_单词匹配\\output.txt","w"); NODE *p=head->next; int i=0,Ei=0,Fi=0; i=IsIt(array); Ei=IsOneCharDifferent(array); Fi=IsMoreOrLessOneChar(array); while(p!=0) { fprintf(fp,"i %d",i); fprintf(fp,"Ei %d",Ei); fprintf(fp,"Fi %d",Fi); p=p->next; } fclose(fp); } //******************************************************************************************* //menu函数提供三种操作,添加新单词;单词匹配;退出。用switch语句分别选择调用3个函数进行操作 //******************************************************************************************* void menu() { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 欢迎使用字典表匹配单词 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 1. 添加新单词 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 2. 单词匹配 ┃\n"); printf(" ┃ ┃\n"); printf(" ┃ 3. 退出程序 ┃ \n"); printf(" ┃ ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf("\n"); printf("请选择所要进行的项目:\n"); int select; scanf("%d",&select); switch(select) { case 1: ; case 2: CharPiPeiSave(); case 3: ; ;} } //****************************************************** //调背景色彩 //****************************************************** void system() { system("color f5"); } //****************************************************** //用main函数调用所需所有函数 //****************************************************** void main() { system(); menu(); }

为什么会出现C语言指针指空的呢

/* * 将node链接到list的末尾 */ static void link_last(ENode *list, ENode *node) { ENode *p=list ; while(p->next_edge) p = p->next_edge; p->next_edge = node; } 编译会提示这方面里的错误 ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556458124_943536.jpg) 0XFEFEFFEFE6表示明指针所指向的空间已经被释放 咋办 求大神解决 完整代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define MAX 100 #define INF (~(0x1<<31)) // 最大值(即0X7FFFFFFF) #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) // 邻接表中表对应的链表的顶点 typedef struct _ENode { int ivex; // 该边的顶点的位置 int weight; // 该边的权 struct _ENode *next_edge; // 指向下一条弧的指针 }ENode, *PENode; // 邻接表中表的顶点 typedef struct _VNode { char data; // 顶点信息 ENode *first_edge; // 指向第一条依附该顶点的弧 }VNode; // 邻接表 typedef struct _LGraph { int vexnum; // 图的顶点的数目 int edgnum; // 图的边的数目 VNode vexs[MAX]; }LGraph; /* * 返回ch在matrix矩阵中的位置 */ static int get_position(LGraph G, char ch) { int i; for(i=0; i<G.vexnum; i++) if(G.vexs[i].data==ch) return i; return -1; } /* * 读取一个输入字符 */ static char read_char() { char ch; do { ch = getchar(); } while(!isLetter(ch)); return ch; } /* * 将node链接到list的末尾 */ static void link_last(ENode *list, ENode *node) { ENode *p=list ; while(p->next_edge) p = p->next_edge; p->next_edge = node; } /* * 创建邻接表对应的图(自己输入) */ LGraph* create_lgraph() { char c1, c2; int v, e; int i, p1, p2; int weight; ENode *node1, *node2; LGraph* pG; // 输入"顶点数"和"边数" printf("输入顶点数: "); scanf("%d", &v); printf("输入边数: "); scanf("%d", &e); if ( v < 1 || e < 1 || (e > (v * (v-1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG=(LGraph*)malloc(sizeof(LGraph))) == NULL ) return NULL; memset(pG, 0, sizeof(LGraph)); // 初始化"顶点数"和"边数" pG->vexnum = v; pG->edgnum = e; // 初始化"邻接表"的顶点 for(i=0; i<pG->vexnum; i++) { printf("顶点(%d): ", i); pG->vexs[i].data = read_char(); pG->vexs[i].first_edge = NULL; } // 初始化"邻接表"的边 for(i=0; i<pG->edgnum; i++) { // 读取边的起始顶点,结束顶点,权 printf("边(%d): ", i); c1 = read_char(); c2 = read_char(); scanf("%d", &weight); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); // 初始化node1 node1 = (ENode*)malloc(sizeof(ENode)); node1->ivex = p2; node1->weight = weight; // 将node1链接到"p1所在链表的末尾" if(pG->vexs[p1].first_edge == NULL) pG->vexs[p1].first_edge = node1; else{ link_last(pG->vexs[p1].first_edge, node1); } // 初始化node2 node2 = (ENode*)malloc(sizeof(ENode)); node2->ivex = p1; node2->weight = weight; // 将node2链接到"p2所在链表的末尾" if(pG->vexs[p2].first_edge == NULL) pG->vexs[p2].first_edge = node2; else{ link_last(pG->vexs[p2].first_edge, node2);} free(node1); free(node2); } return pG; } // 边的结构体 typedef struct _edata { char start; // 边的起点 char end; // 边的终点 int weight; // 边的权重 }EData; /* * 打印邻接表图 */ void print_lgraph(LGraph G) { int i; ENode *node; printf("List Graph:\n"); for (i = 0; i < G.vexnum; i++) { printf("%d(%c): ", i, G.vexs[i].data); node = G.vexs[i].first_edge; while (node != NULL) { printf("%d(%c) ", node->ivex, G.vexs[node->ivex].data); node = node->next_edge; } printf("\n"); } } /* * 获取G中边<start, end>的权值;若start和end不是连通的,则返回无穷大。 */ int getWeight(LGraph G, int start, int end) { ENode *node; if (start==end) return 0; node = G.vexs[start].first_edge; while (node!=NULL) { if (end==node->ivex) return node->weight; node = node->next_edge; } return INF; } /* * 获取图中的边 */ EData* get_edges(LGraph G) { int i; int index=0; ENode *node; EData *edges; edges = (EData*)malloc(G.edgnum*sizeof(EData)); for (i=0; i<G.vexnum; i++) { node = G.vexs[i].first_edge; while (node != NULL) { if (node->ivex > i) { edges[index].start = G.vexs[i].data; // 起点 edges[index].end = G.vexs[node->ivex].data; // 终点 edges[index].weight = node->weight; // 权 index++; } node = node->next_edge; } } return edges; } /* * 对边按照权值大小进行排序(由小到大) */ void sorted_edges(EData* edges, int elen) { int i,j; for (i=0; i<elen; i++) { for (j=i+1; j<elen; j++) { if (edges[i].weight > edges[j].weight) { // 交换"第i条边"和"第j条边" EData tmp = edges[i]; edges[i] = edges[j]; edges[j] = tmp; } } } } /* * 获取i的终点 */ int get_end(int vends[], int i) { while (vends[i] != 0) i = vends[i]; return i; } /* * 克鲁斯卡尔(Kruskal)最小生成树 */ void kruskal(LGraph G) { int i,m,n,p1,p2; int length; int index = 0; // rets数组的索引 int vends[MAX]={0}; // 用于保存"已有最小生成树"中每个顶点在该最小树中的终点。 EData rets[MAX]; // 结果数组,保存kruskal最小生成树的边 EData *edges; // 图对应的所有边 // 获取"图中所有的边" edges = get_edges(G); // 将边按照"权"的大小进行排序(从小到大) sorted_edges(edges, G.edgnum); for (i=0; i<G.edgnum; i++) { p1 = get_position(G, edges[i].start); // 获取第i条边的"起点"的序号 p2 = get_position(G, edges[i].end); // 获取第i条边的"终点"的序号 m = get_end(vends, p1); // 获取p1在"已有的最小生成树"中的终点 n = get_end(vends, p2); // 获取p2在"已有的最小生成树"中的终点 // 如果m!=n,意味着"边i"与"已经添加到最小生成树中的顶点"没有形成环路 if (m != n) { vends[m] = n; // 设置m在"已有的最小生成树"中的终点为n rets[index++] = edges[i]; // 保存结果 } } free(edges); // 统计并打印"kruskal最小生成树"的信息 length = 0; for (i = 0; i < index; i++) length += rets[i].weight; printf("Kruskal=%d: ", length); for (i = 0; i < index; i++) printf("(%c,%c) ", rets[i].start, rets[i].end); printf("\n"); } void main() { LGraph* pG; pG = create_lgraph(); print_lgraph(*pG); // 打印图 kruskal(*pG); // kruskal算法生成最小生成树 }

求大神帮修改,我是菜鸟

#include <stdio.h> #include <ctype.h> #include <string.h> #include <malloc.h> //定义试题结构体 typedef struct node { int id; //试题编号 char problem; //题干 char optionA; //选项A char optionB; //选项B char optionC; //选项C char optionD; //选项D char ans; //答案 struct node*pNext; //指向下一个试题的指针 }Node; void insert() //录入试题 { void insertNode(int id,char problem[200],char optionA[100],char optionB[100], char optionC[100],char optionD[100],char ans); int id; char problem[200]; char optionA[100]; char optionB[100]; char optionC[100]; char optionD[100]; char ans; char choose='Y'; while(toupper(choose)=='Y') {printf("\n**********录入试题**********"); printf("\n请输入试题编号:"); scanf("%d",&id); getchar(); printf("请输入题干:"); gets(problem); printf("请输入选项A:"); gets(optionA); printf("请输入选项B:"); gets(optionB); printf("请输入选项C:"); gets(optionC); printf("请输入选项D:"); gets(optionD); ans=getchar(); getchar(); insertNode(id,problem,optionA,optionB,optionC,optionD,toupper(ans)); printf("\n继续录入(Y\N)?"); scanf("%c",&choose); getchar(); } }Node*pHead=NULL; //存放试题的链表的首节点地址 void view() //查看试题 { Node*tempNode=pHead; while(tempNode!=NULL) {printf("%d\n","%s\n","%s\n","&s\n","%s\n","%s\n","%s\n",tempNode->id,tempNode->problem, tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans);} } void save() //保存试题 { Node*tempNode=pHead; freopen("D:\\****","w",stdout); while(tempNode!=NULL) {printf("%d\n",tempNode->id); printf("%s\n",tempNode->problem); printf("%s\n",tempNode->optionA); printf("%s\n",tempNode->optionB); printf("%s\n",tempNode->optionC); printf("%s\n",tempNode->optionD); printf("%s\n",tempNode->ans); tempNode=tempNode->pNext; } fclose(stdout); freopen("CON","w",stdout); } //申请储存空间 void insertNode(int id,char problem[200],char optionA[100],char optionB[100],char optionC[100],char optionD[100],char ans) { Node*pNew=(Node*)malloc(sizeof(Node)); pNew->id=id; pNew->problem; pNew->optionA; pNew->optionB; pNew->optionC; pNew->optionD; pNew->ans; pNew->pNext=NULL; if(pHead==NULL) pHead=pNew; else {Node*tempNode=pHead; pHead->pNext=pNew; } } void mod() //修改试题 { void view(); int id; //题号 char problem[200]; //题干 char optionA[100]; //选项A char optionB[100]; //选项B char optionC[100]; //选项C char optionD[100]; //选项D char ans; //答案 char choose; Node*tempNode=pHead; Node*previousNode=pHead; printf("\n请输入要修改的题号:"); scanf("%d",&id); getchar(); while(tempNode!=0) //从第一题开始找,直到找到指定的试题 { if(id==tempNode->id) break; previousNode=tempNode; tempNode=tempNode->pNext; } if(tempNode==NULL) { printf("该试题不存在"); return; } //显示试题信息 printf("%d\n","%s\n","%s\n","&s\n","%s\n","%s\n","%s\n",tempNode->id,tempNode->problem, tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans); printf("请输入修改后的试题信息"); printf("\n请输入试题编号:"); scanf("%d",&id); getchar(); printf("请输入题干:"); gets(problem); printf("请输入选项A:"); gets(optionA); printf("请输入选项B:"); gets(optionB); printf("请输入选项C:"); gets(optionC); printf("请输入选项D:"); gets(optionD); ans=getchar(); getchar(); printf("是否修改(Y\N)?"); scanf("%c",&choose); getchar(); if(toupper(choose)=='Y') { insertNode(id,problem,optionA,optionB,optionC,optionD,toupper(ans)); } //显示所有试题 view(); } void del() //删除试题 { int id; char choose; Node*tempNode=pHead; //存放试题链表的首地址,即第一道试题(结构体)的地址 Node*previousNode=pHead; //指定试题的上一道试题的地址 printf("\请输入要删除的试题题号:"); scanf("%d",&id); getchar(); while(tempNode!=0) //从第一题开始找,直到找到指定的试题 { if(id==tempNode->id) break; previousNode=tempNode; //当前节点是下一个节点的前节点 tempNode=tempNode->pNext; //指向下一节点 } if(tempNode==NULL) { printf("该试题不存在"); return; } //显示试题信息 printf("%d\n","%s\n","%s\n","&s\n","%s\n","%s\n","%s\n",tempNode->id,tempNode->problem, tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans); printf("要删除该题么(Y\N)?"); scanf("%c",choose); getchar(); if(toupper(choose)=='Y') { //tempNode是要删除的试题的地址 if(tempNode==pHead) pHead=tempNode->pNext; else previousNode->pNext=tempNode->pNext; free(tempNode); } } void test(); //考试 int main() { int a=0; char choose=' '; void insert(); void view(); void save(); void mod(); void del(); void test(); while(choose!='0') { printf("\n**********主菜单**********"); printf("\n 欢迎进入考试系统"); printf("\n 1:试题管理"); printf("\n 2:开始考试"); printf("\n 3:退出"); printf("\n**************************"); printf("\n请选择:"); choose=getchar(); getchar(); switch(choose) { case '1': printf("*****************************\n"); printf("**********1.新增题目*********\n"); printf("**********2.删除题目*********\n"); printf("**********3.修改题目*********\n"); printf("**********4.查看题目*********\n"); printf("**********5.保存*************\n"); printf("**********6.返回上一级*******\n"); printf("请选择:"); scanf("%d",a); switch(a) { case 1: insert(); break; case 2: del(); break; case 3: mod(); break; case 4: view(); break; case 5: break; case 6: break; } break; case '2': break; case '3': break; default : break; } } return 0; }

求大神,写的程序有错误,新手找不出来,求指点

图书信息管理系统(学号尾数为4和9的同学完成) (1)设计要求 设计并实现一个图书信息管理系统。图书信息包括编号、书名、作者名、图书分类号、出版单位、出版时间、单价等。 (2)系统功能  系统以菜单的方式工作:要求界面清晰、美观、友好、易用。  图书信息导入功能:可以从文件导入图书信息。  浏览:能够显示所有图书信息,显示格式清晰、美观。  查询:能够根据图书分类号查询,并输出查询结果。  图书信息添加:可以添加新的图书信息,并实现信息存盘。  图书信息修改:输入图书编号,对相应的图书进行修改,并在修改后实现信息存盘。  图书信息删除:输入图书编号,对相应的图书进行删除,并在删除后实现信息存盘。 #include<iostream.h> /*引用库函数*/ #include <stdio.h> # include <string.h> # include <conio.h> # include <stdlib.h> # include <windows.h> typedef struct book_info//定义图书信息的结构体变量并声明新的类型名 { char AN[10]; /*登录号*/ char name[20]; /*书名*/ char author[20]; /*作者名*/ char clc[10]; /*分类名*/ char company[20]; /*出版单位*/ char date[20]; /*出版日期*/ char price[10]; /*价格*/ struct book_info *next; }Booklist,*Pointer; int num=0;//全局变量的定义 Pointer Head=NULL;//头指针为空 FILE *fp;//指向文件的指针 /*声明函数*/ int menu_select();/*主菜单函数*/ void Insert(Pointer * Head);/*录入函数*/ void Scan(Pointer Head);/*显示函数*/ void Search_name(Pointer Head);/*按书名查找函数*/ void Search_author(Pointer Head);/*按作者名查找函数*/ void Delete(Pointer * Head);//删除函数 void Update(Pointer Head);//修改函数 void Exit();//退出函数 void main()//主函数 { system("cls");/*运行前清屏*/ for(;;) { switch(menu_select()) { case 1:Insert(& Head); break; case 2:Scan(Head); break; case 3:Search_name(Head); break; case 4:Search_author(Head); break; case 5:Delete(&Head); break; case 6:Update(Head); break; case 0:Exit(); default: putchar('\a'); } } } menu_select()//主菜单函数 { int a; printf("\n\t\t\t欢迎使用图书信息管理系统\n\n\n\n\n\t\t ***** 请按任意键进入系统菜单! ***** \n"); getch(); system("cls"); printf("\t\t********************MENU*********************\n");//主菜单 printf("\t\t 1. 录入图书信息\n"); printf("\t\t 2. 浏览图书信息\n"); printf("\t\t 3. 按书名查询图书信息\n"); printf("\t\t 4. 按作者名查询图书信息\n"); printf("\t\t 5. 删除图书信息\n"); printf("\t\t 7. 修改图书信息\n"); printf("\t\t 0. 退出\n"); printf("\t\t***********************************************\n"); do { printf("\n\t请选择您所需要的功能:"); scanf("%d",&a); } while (a<0||a>6); return a; } void Insert(Pointer * Head) //录入图书信息函数 { char AN[10] ; char c; Pointer p,q,r; printf("\n\t\t**************** 请输入图书信息 ****************\n");/*交互输入*/ printf("\n\t\t请输入登录号:"); scanf("%s",AN); p=q= * Head;//检测登录号是否重复 while(p!=NULL) { if(strcmp(p->AN,AN)==0) { printf ("已经有相同的登录号:");return;} else {q=p;p=p->next;} } r=(Pointer)malloc(sizeof(Booklist)); r->next=NULL; if(r==NULL) {printf("分配空间失败!");return;} if(q==NULL) * Head=r; else {q->next=r;} strcpy(r->AN,AN); printf("\n\t\t输入书名:"); //录入图书信息 scanf("%s",r->name); getchar(); printf("\n\t\t输入作者名:"); scanf("%s",r->author); getchar(); printf("\n\t\t输入分类号:"); scanf("%s",r->clc) ; getchar(); printf("\n\t\t输入出版单位:"); scanf("%s",r->company) ; getchar(); printf("\n\t\t输入出版日期:"); gets(r->date) ; printf("\n\t\t输入价格:"); scanf("%s",r->price); do { printf("\n\t\t录入成功!!!!"); num++; printf("选择是否继续录入(Y/N)?:"); /*连续录入图书信息*/ getchar(); scanf("%c",&c); if(c=='y'||c=='Y') Insert(Head); else { if(c=='n'||c=='N') return; else printf("\n\t\t输入错误,请重新输入!!!"); } } while(c!='y'&&c!='n'&&c!='Y'&&c!='N'); } 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; } } void Search_name(Pointer Head) //按书名查找函数 { int flag=0;//标记变量的初值 char name[10]; Pointer p; printf ("\n请输入需要查询的书名:"); scanf("%s",name); printf("\n\t\t************* 以下是您查找的信息 ***************"); p=Head; while(p!=NULL) { if(strcmp(p->name,name)==0)//查找符合的图书 { printf("\n\t登录号: %-10s",p->AN); printf("\n\t书名: %-20s",p->name); printf("\n\t作者名: %-20s",p->author); printf("\n\t分类号: %-10s",p->clc); printf("\n\t出版单位:%-20s",p->company); printf("\n\t出版时间:%-20s",p->date); printf("\n\t价格: ¥%-10s",p->price); flag=1;//找到标记变量设为1 p=p->next;//指针走到下一个节点 } else p=p->next; } if(flag==0) printf("\n\t\t没有相同书名纪录"); printf("\n\t\t请按任意键返回主菜单"); getchar(); } void Search_author(Pointer Head) //按作者名查找函数 { int flag=0; char author[10]; Pointer p; printf ("\n请输入需要查询的作者名:"); scanf("%s",author); printf("\n\t\t************* 以下是您查找的信息 ***************"); p=Head; while(p!=NULL)//查找符合的图书 { if(strcmp(p->author,author)==0)/*找到图书显示信息*/ { printf("\n\t登录号: %-10s",p->AN); printf("\n\t书名: %-20s",p->name); printf("\n\t作者名: %-20s",p->author); printf("\n\t分类号: %-10s",p->clc); printf("\n\t出版单位:%-20s",p->company); printf("\n\t出版时间:%-20s",p->date); printf("\n\t价格: ¥%-10s",p->price); flag=1; p=p->next; } else p=p->next; } if(flag==0) printf("\n\t\t没有相同作者名纪录"); printf("\n\t\t请按任意键返回主菜单"); getch(); } void Delete(Pointer *Head)/*删除函数*/ {int flag=1; char AN[10]; char c,z; Pointer p,q; printf("\n\t\t******************* 图书删除 *******************\n"); printf("\t请输入要删除图书的信息的登录号:"); scanf("%s",AN); p=q=*Head;/*查找符合条件的图书*/ while(p!=NULL&&flag) { if(strcmp(p->AN,AN)==0)/*找到该图书*/ { printf("\t\n登录号:%-10s",p->AN);//显示即将要删除的图书的信息 printf("\t\n书名:%-20s",p->name); printf("\t\n作者名:%-20s",p->author); printf("\t\n分类号:%-10s",p->clc); printf("\t\n出版单位:%-20s",p->company); printf("\t\n出版时间:%-20s",p->date); printf("\t\n价格:¥%-10s\n",p->price); printf("确定删除?确定请输Y,其它则不删除");//询问是否删除 getchar(); scanf("%c",&z); if(z=='Y'||z=='y') { if(p==*Head) {*Head=p->next;free(p);}/*删除图书信息*/ else {q->next=p->next;free(p);} flag=0; } else {printf("图书信息未删除,返回主菜单。"); return; } } else {q=p;p=p->next;}/*指针走到下一个节点*/ printf("\t\t删除成功!!!\n"); } if(flag) printf("\t没有找到可以删除的数据!!!"); do { printf("选择是否继续删除(Y/N)?:"); /*连续删除图书信息*/ getchar(); scanf("%c",&c); if(c=='y'||c=='Y') Delete(Head);/*继续删除*/ else { if(c=='n'||c=='N') return;/*不删除返回主菜单*/ else printf("\n\t\t输入错误,请重新输入!!!"); } } while(c!='y'&&c!='n'&&c!='Y'&&c!='N'); } void Update(Pointer Head)/*图书信息修改函数*/ { int flag=1; char AN[10]; char c; Pointer p; printf("\n\t\t***************** 图书信息修改 *****************\n"); printf("\t请输入要修改的图书的登录号:"); scanf("%s",AN);/*查找符合条件的图书*/ p=Head; while(p!=NULL&&flag) { if(strcmp(p->AN,AN)==0) { printf("\n\t\t请输入登录号:");/*修改图书信息*/ scanf("%s",p->AN); printf("\n\t\t输入书名:"); scanf("%s",p->name); getchar(); printf("\n\t\t输入作者名:"); scanf("%s",p->author); getchar(); printf("\n\t\t输入分类号:"); scanf("%s",p->clc) ; getchar(); printf("\n\t\t输入出版单位:"); scanf("%s",p->company) ; getchar(); printf("\n\t\t输入出版日期:"); gets(p->date); printf("\n\t\t输入价格:"); scanf("%s",p->price); flag=0; printf("修改成功!!\n"); } else p=p->next;/*指针走到下一个节点*/ } if(flag) printf("\n\t\t没有该图书记录!!!"); do { printf("选择是否继续修改(Y/N)?:"); /*连续修改图书信息*/ getchar(); scanf("%c",&c); if(c=='y'||c=='Y') Update(Head);/*继续修改*/ else {if(c=='n'||c=='N') return;//不修改,返回菜单 else printf("\n\t\t输入错误,请重新输入!!!"); } } while(c!='y'&&c!='n'&&c!='Y'&&c!='N');//输入错误则继续询问 } void Exit()/*退出程序的函数*/ {char c; do {printf("\n\t\t退出中......是否保存到文件(Y/N)?"); /*询问是否保存图书信息,防止丢失*/ getchar(); scanf("%c",&c); if(c=='y'||c=='Y') {Save(); exit(0); } else {if(c=='n'||c=='N') {exit(0); } else printf("\n\t\t输入错误,请重新输入!!!"); } } while(c!='y'&&c!='n'&&c!='Y'&&c!='N');//错误则继续询问 }

数据结构堆栈的链式存储结构实现代码,求大神精确解释该代码的头节点,压入栈堆和删除并返回堆栈的栈顶元素

#include <stdio.h> #include <malloc.h> #define maxsize 100 struct LNode{ //指针变量名称 union { int num; char ch; }data; struct LNode *next; //结构体类型 ,lnode直接定义结构体变量或者指针 }*mylink; //重定义为mylink void deletee(struct LNode *aa){//定义删除函数 int pos,i; struct LNode *p,*q; if(aa->data.num==0) //判断是否为空 。 printf("EMPTY!!!\n");//空 else{ printf("Please input position:"); //如果为空输出Please input position: scanf("%d",&pos); if (pos>aa->data.num || pos<1)//判断位置 printf("THE POSITION IS ERROR!!!\n");// 这个位置是错误的 else{ i=1; p=aa; while(i<pos){ p=p->next; i++; } q=p->next; p->next=q->next; aa->data.num--; free(q); } p=aa->next; while(p!=NULL){ printf("%c",p->data.ch ); p=p->next; } printf("\n"); } return; } void insert(struct LNode *aa){ //定义插入函数 int pos,i; char x; struct LNode *p,*q;//申请内存,构建链式储存结构堆栈。 q=(struct LNode*)malloc(sizeof(struct LNode)); if(q==NULL) //判断是否满了 printf("FULL!!!\n"); //满 else{ printf("Please input position:"); scanf("%d",&pos); if (pos>aa->data.num+1 || pos<0) printf("THE POSITION IS ERROR!!!\n"); else{ getchar(); printf("Please input the char:"); scanf("%c",&x); i=1; p=aa; while(i<pos){ p=p->next; i++; } q->data.ch=x; q->next=p->next; p->next=q; aa->data.num++; } p=aa->next; while(p!=NULL){ printf("%c",p->data.ch); p=p->next; } printf("\n"); } return; } int main(int n){ mylink=(struct LNode*)malloc(sizeof(struct LNode)); mylink->data.num=0; mylink->next=NULL; while(1){ printf("1.INSERT\n2.DELETE\n3.EXIT\nPlease input the number:"); scanf("%d",&n); switch (n){ case 1: insert(mylink); break; case 2: deletee(mylink); break; case 3: return(0); default: break; } } }

为什么我的插入、删除、计数出错,小白需要大神帮改下

#include<stdio.h> #include<stdlib.h> #define L sizeof(struct Linklist) struct Linklist { int date; struct Linklist *next;//定义了一个指向struct linklist类型数据的指针变量next,用来存放结点的地址。 }; struct Linklist *creat(); void print (struct Linklist ); void insert(struct Linklist ,int i,int x); void delet(struct Linklist ,int i); int GetElem(struct Linklist ,int i); int jishu(struct Linklist *head); struct Linklist *creat()//定义creat函数,指针类型,所以函数带回一个指针量 { printf("请输入链表数据:"); struct Linklist *head,*p,*p1; head=(struct Linklist*)malloc(L); head->next=NULL; head=p=p1=(struct Linklist*)malloc(L); scanf("%d",&p->date); int n=1; while(p->date!=0) { p=(struct Linklist*)malloc(L); scanf("%d",&p->date); p1->next=p; p1=p; n++; } p->next=NULL; return(head); } //建立链表 void print (struct Linklist *head)// struct Linklist *head是定义一个结构体指针变量head { struct Linklist *p; printf("链表数据为:"); p=head; while(p->date!=0) { printf("%d ",p->date); p=p->next; } printf("\n"); return; }//输出链表 void insert( struct Linklist *head,int i,int x) { int j=1; struct Linklist *p,*r; p=head; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) printf("插入出错!"); r=(struct Linklist *)malloc(L); r->date=x; r->next=p->next; p->next=r; }//在第i个位置之前插入数据x void delet(struct Linklist *head,int i) { int j=1; struct Linklist *p,*r; p=head->next; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i-1) printf("删除出错!"); r=p->next; p->next=r->next; free(r); }//删除第i个位置上的数据 int GetElem(struct Linklist *head,int i) { int j=1,e; struct Linklist *p; p=head->next; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i) printf("查找出错!"); e=p->next->date; return(e); }//查找第i个位置上的数据是多少,并赋值给e int jishu(struct Linklist *head) { int n=0; struct Linklist *p; p=head; while(p->next!=NULL) { n++; p=p->next; n++; } return(n); }//计数,链表的个数 int main() { int m,n,k,h,e,o; struct Linklist *head; printf("请选择您要做的操作:\n1.建立链表\n2.输出链表\n3.给链表中插入数据\n4.删除链表中的数据\n5.查找链表中的数据\n6.链表中的数据计数\n\n"); head=creat(); print (head); printf("请输入插入的位置和插入的数据");//调用插入函数 scanf("%d,%d",&m,&n); insert(head, m, n); print(head); printf("\n"); printf("请输入要删除的数据的位置");//调用删除函数 scanf("%d",&k); delet( head, k); print(head); printf("\n"); printf("请输入要查找数据的位置");//调用查找函数 scanf("%d",&h); e=GetElem( head,h); printf("要查找的数据的位置在第%d个\n",&e); o=jishu( head); printf("链表中的数据有%d个\n",&o); return 0; }

如何处理以下问题,大神帮忙看下,指针在函数中用引用型怎么使用

void main(){ LinkList L; BOOL temp; int num, loc, flag = 1; char j; Stu stu; printf("本程序实现链式结构的线性表操作: 插入,删除,定位,查找等\n"); printf("请输入初始链表长度:"); //输入生成单链表时的元素个数 scanf_s("%d", &num); CreatList(L, num); //生成单链表 ListPrint(L); while (flag) { printf("请选择:\n"); printf("1.显示所有学生记录\n"); //显示链表元素 printf("2.插入一个学生记录\n"); //插入链表元素 printf("3.删除一个学生记录\n"); //删除链表元素 printf("4.按关键字查找对应的学生记录\n"); //按关键字查找 printf("5.按结点序号查找学生记录\n"); //按结点序号查找 printf("6.退出程序 \n"); //退出 scanf_s(" %c", &j); switch (j){ case '1': ListPrint(L); break; case '2': printf("请插入位置和输入元素(学生记录):\n"); printf("格式: 位置 学号 姓名 分数;例如:3,1001,张三,95.5\n"); //输入要插入的元素和要插入的位置 scanf_s("%d %d %s %f", &loc, &stu.sn, &stu.name, &stu.score); temp = ListInsert(L, loc, stu); //插入 if (temp == False) printf("插入失败!\n"); else printf("插入成功!\n"); ListPrint(L); break; case '3': printf("请输入要删除元素的结点位置:"); scanf_s("%d", &loc); //输入要删除的节点的位置 temp = ListDelete(L, loc, stu); //删除 if (temp == False) printf("删除失败!\n"); //删除成功,显示该元素 else printf("成功删除了一个元素:%d,%s,%.2f\n", stu.sn, stu.name, stu.score); ListPrint(L); break; case '4': if (L->next == NULL) printf("链表为空!\n"); else{ printf("请输入查找元素(学号 姓名 分数):"); scanf_s("%d %s %f", &stu.sn, &stu.name, &stu.score); //输入要查找的元素 temp = ListFind_keyword(L, stu, loc); //按关键字查找 if (temp == False) printf("没有找到该元素!\n"); else printf("该元素在链表的第%d 个结点\n", loc); } break; case '5': if (L->next == NULL) printf("链表为空!\n"); //链表为空 else{ printf("请输入查找位置:"); scanf_s("%d", &loc); //输入查找元素的位置 temp = ListFind_loc(L, loc, stu); //按结点序号查找 if (temp == False) printf("该位置不存在!\n"); else printf("第%d 个元素是:%d %s %.2f\n", loc, stu.sn, stu.name, stu.score); } break; default: flag = 0; DestroyLink(L); //销毁链表,回收空间 printf("程序结束,按任意键退出!\n"); } } } 头文件: #ifndef _LINK_H #define _LINK_H #include <stdlib.h> #include <stdio.h> #include <conio.h> enum BOOL{ False, True }; //定义 BOOL 型 typedef struct{ int sn; char name[10]; float score; }Stu; typedef Stu ElemType; typedef struct node{ ElemType data; //数据域 struct node *next; //指向下一个节点的指针 }LNode, *LinkList; void CreatList(LinkList &L, int n); //在单链表的第 i 各位置插入元素 e,成功返回 True,失败返回 False BOOL ListInsert(LinkList &L, int i, ElemType e); //在单链表中删除第 i 个元素,成功删除返回 True,并用 e 返回该元素值,失败返回 False BOOL ListDelete(LinkList &L, int i, ElemType &e); //在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False BOOL ListFind_keyword(LinkList L, ElemType e, int &i); //在单链表中查找第 i 个元素,成功返回 True,并用 e 返回该元素值,失败返回 False BOOL ListFind_loc(LinkList L, int i, ElemType &e); void ListPrint(LinkList L); //显示链表所有元素 void DestroyLink(LinkList &L); //删除链表,回收内存空间 int CompareElemType(ElemType a, ElemType b); //比较结构体数据的异同 #endif 另一个头文件: #include <string.h> void CreatList(LinkList &L, int n){ //生成一个带头结点的有 n 个元素的单链表 int i; LinkList p; L = (LinkList)malloc(sizeof(LNode)); //申请生成头结点 if (!L) exit(1); L->next = NULL; printf("使用头插法,请逆序位输入%d 个学生信息(学号 姓名 分数),如 101 张三 97.5: \n",n); getchar(); for (i = n; i>0; --i) { //头插法 p = (LinkList)malloc(sizeof(LNode)); //申请生成新结点 if (!p) exit(1); scanf("%d %s %f", &p->data.sn, &p->data.name, &p->data.score); p->next = L->next; L->next = p; } printf("%d 个结点的链表已经建立\n", n); } BOOL ListInsert(LinkList &L, int i, ElemType e){ //在单链表的第 i 各位置插入元素 e,成功返回 True,失败返回 False LinkList s, p = L; int j = 0; while (p && j<i - 1) { //找到第 i-1 个结点的位置 p = p->next; ++j; } if (!p || j>i - 1) return False; //i<1 或者 i 大于表长+1 s = (LinkList)malloc(sizeof(LNode)); //申请生成一个新结点 if (!s) exit(1); //将新结点插入到单链表中 s->data.sn = e.sn; strcpy(s->data.name, e.name); s->data.score = e.score; s->next = p->next; p->next = s; return True; } BOOL ListDelete(LinkList &L, int i, ElemType &e){//在单链表中删除第 i 个元素,成功删除返回 True,并用 e 返回该元素值,失败返回 False LinkList q, p = L; int j = 0; while (p->next && j<i - 1){ //查找第 i-1 个结点位置 p = p->next; ++j; } if (!(p->next) || j>i - 1) return False; //删除位置不合理 q = p->next; p->next = q->next; //删除该元素 e.sn = q->data.sn; strcpy(e.name, q->data.name); e.score = q->data.score; //e 取得该元素值 free(q); //释放该元素空间 return True; } BOOL ListFind_keyword(LinkList L, ElemType e, int &i){ //在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False i = 1; LinkList p = L->next; ElemType a = p->data; while (p && !(CompareElemType(a, e))){ //p 指针指向下一个,直到找到关键字 e 或到 链表尾为止 p = p->next; i++; } if (!p || !(CompareElemType(a, e))) return False; //该元素在链表中不存在 else return True; } BOOL ListFind_loc(LinkList L, int i, ElemType &e){ //在单链表中查找第 i 个元素,成功返回 True, 并用 e 返回该元素值,失败返回 False LinkList p = L->next; int j = 1; while (p && j<i) { //移动指针,直到找到第 i 个元素或 p 为 NULL p = p->next; ++j; } if (!p || j>i) return False; //第 i 个元素不存在 e.sn = p->data.sn; strcpy(e.name, p->data.name); e.score = p->data.score; //查找成功,用 e 取得 第 i 个元素值 return True; } void ListPrint(LinkList L) {//显示链表所有元素 LinkList q = L->next; printf("链表所有元素:\n"); while (q){ printf("学号:%10d 姓名:%13s 分数:%10.2f\n", q->data.sn, q->data.name, q->data.score); q = q->next; } printf("\n"); } void DestroyLink(LinkList &L){ //删除链表,回收内存空间 LinkList q; while (L){ q = L->next; free(L); L = q; } printf("链表已经销毁\n"); } int CompareElemType(ElemType a, ElemType b){ //比较结构体数据的异同 if (a.sn == b.sn && a.score == b.score && strcmp(a.name, b.name) == 0) return 1; else return 0; 我运行有这个错误,为什么: 错误 1 error LNK2019: 无法解析的外部符号 "void __cdecl create(struct LNode *

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; }

求大神,根据指定位置插入删除电话号码本联系人,但是插入后的联系人个数不能返回

#include <malloc.h> #include <stdlib.h> #include <string.h> #include <cstdio> typedef struct LNode { char name[10]; char phone_number[15]; struct LNode *next; }LNode,*LinkList; void InitList_L(LinkList &L,int n); void Add_L(LinkList &L,int i,char name[],char phone_number[],int n); void Dele_L(LinkList &L,int i,int n); void Show_L(LinkList L); int main() { LinkList L; int i=1,n; char name[10]; char number[15]; while(i) { printf("\n"); printf("**********1:新建链表*****************\n"); printf("**********2:插入新的联系人和号码*****\n"); printf("**********3:删除已有联系人和号码*****\n"); printf("**********0:退出*********************\n"); printf("请在序号0-3中选择\n"); printf("\n"); scanf("%d",&i); switch(i) { case 1: printf("输入现有联系人个数:\n"); scanf("%d",&n); InitList_L(L,n); Show_L(L); printf("\n"); break; case 2: printf("输入你要插入位置,以及联系人的名字和号码\n"); scanf("%d %s %s",&i,name,number); Add_L(L,i,name,number,n); Show_L(L); printf("\n"); break; case 3: printf("输入你要删除的位置\n"); scanf("%d",&i); Dele_L(L,i,n); Show_L(L); printf("\n"); break; case 0: printf("谢谢您的使用,再见!"); break; default: printf("您输入的信息有误,请检查!"); } } return 0; } void InitList_L(LinkList &L,int n) { LinkList p; int i; printf ("请输入姓名,号码\n"); L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=0;i<n;i++) { p=(LinkList)malloc(sizeof(LNode)); scanf("%s %s",&p->name,&p->phone_number); p->next=L->next; L->next=p; } } void Add_L(LinkList &L,int i,char name[],char phone_number[],int n) { int j; LinkList p,t; if(i<1||i>n+1) printf("您要插入的位置不存在,请检查!"); else { j=0; p=L; //for(j=0;j<i;j++) while(j<i-1) { p=p->next; j++; } t=(LinkList)malloc(sizeof(LNode)); strcpy(t->name,name); strcpy(t->phone_number,phone_number); t->next=p->next; p->next=t; n++; } } void Dele_L(LinkList &L,int i,int n) { LinkList p,t; int j; if(i<1||i>n) printf("您要删除的位置不存在,请检查!"); else { j=0; p=L; while(j<i-1) { p=p->next; j++; } t=p->next; p->next=t->next; free(t); n--; } } void Show_L(LinkList L) { LinkList p; p=L->next; printf("姓名 号码\n"); while(p) { printf("%s",p->name); printf(" %s",p->phone_number); p=p->next; printf("\n"); } }

C语言 数据结构 创建链表的时候,在for循环中的变量是否每次循环结束都被销毁

如题,先谢谢大神解答。 ![图片说明](https://img-ask.csdn.net/upload/201610/04/1475513733_456747.png) ![图片说明](https://img-ask.csdn.net/upload/201610/04/1475513745_903732.png)

我觉得我见鬼了,请大神帮我看看我到底是不是真的见鬼了,现在凌晨三点了

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node ND; struct Node{ //结构体 int data; //数据预,存放结构体的数据,哲理简单化,假设只有一个data struct Node * pNext; //指针域,用来存放下一个节点的指针或者上一个节点的指针或者其他节点的指针,这里简化只存放下一个节点的指针 }; /*函数声明*/ //void traverse_list(ND * pHead); ND * create_list(int len); void drop(ND * pHead); //bool is_empty(ND * pHead); int length_list(ND * pHead); //bool insert_list(ND * pHead,int,int); //bool delete_list(ND * pHead,int,int *); //void sort_list(ND * pHead); int main(){ //主方法作为测试方法 int len,val; ND * pHead; ND * p=NULL; printf("请输入要创造多少个节点:\n"); scanf("%d",&len); pHead=create_list(len);//创建一个头结点,获得其地址 printf("链表的长度为:%d\n",length_list(pHead)); p=pHead; //让p也指向头指针 while(p->pNext!=NULL){ printf("大半夜真的见鬼了\n"); } printf("添加完毕!\n"); drop(pHead); return 0; } /* 根据用户输入的长度来创造链表,但是这个链表是空链表 */ ND * create_list(int len){ //创建链表,返回链表头结点的地址 int i; ND * pNew=NULL; ND * pTail=NULL; ND * pHead=(ND *)malloc(sizeof(ND)); //创建头节点,把首地址给指针变量pHead,头结点不存放任何数据,但是头结点的指针域要指向后面创造的节点 if(pHead==NULL){ printf("动态分配空间失败!"); exit(-1); } pHead->pNext=NULL; //将头结点的指针域放空 pTail=pHead; //此时pTail也指向头结点了 for(i=0;i<len;i++){ pNew=(ND *)malloc(sizeof(ND)); if(pNew==NULL){ printf("动态开辟空间失败\n"); exit(-1); } pTail->pNext=pNew; pNew->pNext=NULL; pTail=pNew; } return pHead; } void drop(ND * pHead){ //释放链表 ND * t=NULL; while(pHead->pNext!=NULL){ t=pHead->pNext; //t指向下一个节点 free(pHead); //将pHead指向的节点删除释放 pHead=t; //让pHead也指向下一个节点 t=NULL; } //free(pHead); } //bool is_empty(ND * pHead){ //为什么要报错??? // if(pHead->pNext==NULL){ // return true; // }else{ // return false; // } //} int length_list(ND * pHead){ //链表长度 int num=0; ND * p=pHead; while(p->pNext!=NULL){ p=p->pNext; num++; } return num; } 这是用C写的链表。 见鬼的地方是主函数中的while函数,条件是p->pNext!=NULL。头结点指针域不为空。我已经测试了,链表除了最后一个的指针域为空其他都是有地址的。可是这个循环就硬是死循环了。我试着创造了两个节点和三个节点或者五个,用输出函数看了,最后一个节点地址都是00000000,可是while就是死循环。现在夜深了。外面有人在哭,我怀疑我见鬼了 。还有bool is_empty(ND * pHead)函数只要一取消注释就要报错

Linux中c语言多线程gdb调试“Cannot access memory at address”如何解决

程序的目的是做一个xml解析的工作。 部分代码如下: #define BUFLEN 10240 typedef struct buffer_t//需要操作的结构体 { char *buf; Bcsarray *bcsay; int bufnum; struct buffer_t *next; }databuf; databuf *buf, *bufs;//buf为链表头,bufs为操作时的游动指针 void readxml(void *arg);//第一个线程,已经正确初始化了buf链表,每块中buf->buf的大小都为BUFLEN+1;问题不在这个函数中,故不再列出 void division(void *arg)//有两个重要位置我标记了出来,后面有说明 { bufs = buf; while (bufs != NULL) { int i = 0, j = 0; int n = 0; if (bufs->buf[i] == '<') { j = i; j++; switch (bufs->buf[j]) { case '/': { while (1) { j++; if (bufs->buf[j] == 0) { if (bufs->next == NULL) { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; bufs->bcsay->bcs[n].bt = Etag_start; i = j; break; } else { char *e = (char*)malloc(sizeof(char)*(BUFLEN + 1)); **strcpy(e, bufs->next->buf);//这里报错(2号位置)** strcpy(bufs->next->buf, bufs->buf + i); strcat(bufs->next->buf, e); bufs->buf[i] = 0; free(e); break; } } if (bufs->buf[j] == '<') { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; bufs->bcsay->bcs[n].bt = Etag_start; n++; i = j; break; } } }; break; case '?': { while (1) { j++; if (bufs->buf[j] == 0) { char *e = (char*)malloc(sizeof(char)*(BUFLEN + 1)); strcpy(e, bufs->next->buf); strcpy(bufs->next->buf, bufs->buf + i); strcat(bufs->next->buf, e); bufs->buf[i] = 0; free(e); break; } if (bufs->buf[j] == '>') { if (bufs->buf[j - 1] == '?') { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; bufs->bcsay->bcs[n].bt = PI_start; n++; j++; i = j; break; } } } }; break; case '!': { while (1) { j++; if (bufs->buf[j] == 0) { char *e = (char*)malloc(sizeof(char)*(BUFLEN + 1)); strcpy(e, bufs->next->buf); strcpy(bufs->next->buf, bufs->buf + i); strcat(bufs->next->buf, e); bufs->buf[i] = 0; free(e); break; } if (bufs->buf[j] == '>') { if (bufs->buf[j - 1] == '-'&&bufs->buf[j - 2] == '-') { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; bufs->bcsay->bcs[n].bt = COMMENT_start; n++; j++; i = j; break; } else if (bufs->buf[j - 1] == ']'&&bufs->buf[j - 2] == ']') { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; bufs->bcsay->bcs[n].bt = CDSECT_start; n++; j++; i = j; break; } } } }; break; default: { while (1) { j++; if (bufs->buf[j] == 0) { if (bufs->next == NULL) { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; int k = 1; while (1) { if (bufs->buf[j - k] == '>') { if (bufs->buf[j - k - 1] == '/') bufs->bcsay->bcs[n].bt = Etag_start; else bufs->bcsay->bcs[n].bt = Stag_start; break; } k++; } i = j; } else { char *e = (char*)malloc(sizeof(char)*(BUFLEN + 1)); **strcpy(e, bufs->next->buf);//这里正常运行(1号位置)** strcpy(bufs->next->buf, bufs->buf + i); strcat(bufs->next->buf, e); bufs->buf[i] = 0; free(e); break; } } if (bufs->buf[j] == '<') { bufs->bcsay->bcs[n].bufnum = bufs->bufnum; bufs->bcsay->bcs[n].bufpos = i; int k = 1; while (1) { if (bufs->buf[j - k] == '>') { if (bufs->buf[j - k - 1] == '/') bufs->bcsay->bcs[n].bt = Etag_start; else bufs->bcsay->bcs[n].bt = Stag_start; break; } k++; } n++; i = j; break; } } }; break; } } else { i++; } } bufs = bufs->next; } } 两个线程我已经做了处理,暂时是串行执行的,互不影响。division这个线程,第一次(1号位置)和第二次(二号位置)运行的分支我已标注出,分支中的逻辑完全相同,但是只有第一次可以运行通过,第二次就不行了。循环会有很多次,但现在只能运行到第二次结尾。本来想删掉一部分无关代码,但害怕出问题,敬请谅解。 以上代码,我在windows下用vs2015跑过。把两个线程串行地写在一个函数中,正常运行。但是在Linux下用多线程,就会出现以上问题,strcpy函数位置出错。 后来经过调试发现,是在二号位置中,bufs->next->buf的问题。当我在gdb中调试到这里时,用“p bufs->next->buf”输出内容时,就出现Cannot access memory at address的错误。但是我访问数据结构中的其他项,比如 “p bufs->next->bufnum”,输出正常。并且在上一个线程中,一切正常。 求大神指点。

贪吃蛇编译连接都没错,运行出现如下问题,请问能否解惑?救命呐

![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926028_916250.png)![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926041_439219.png)![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926054_932560.png)![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926071_685721.png)![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926087_396492.png)![图片说明](https://img-ask.csdn.net/upload/201905/15/1557926097_793903.png) ```新建工程项目 #include"stdafx.h" #include"stdio.h" #include"time.h" #include"windows.h" #include"stdlib.h" #include"conio.h" //进行数据输入和数据输出 #define U 1 #define D 2 #define L 3 #define R 4 typedef struct snake //蛇身一节点 { int x; //节点x坐标 int y; struct snake *next; //蛇身下一节点 }snake; int score=0,add=10; //总得分与每次吃食物得分 int highscore=0; int status,sleeptime=200; //蛇前进状态,每次运行时间间隔 snake *head,*food; //定义 snake *q; int endgamestatus=0; //蛇结束时状态 HANDLE hOut; //声明 void gotoxy(int x,int y); //设置光标位置 int color(int c); //文字颜色 void printsnake(); //欢迎界面中字符画 // void welcometogame(); //开始界面 void creatmap(); //游戏地图 void scoreandtips(); //右侧得分和小提示 void initsnake(); //初始化绘制蛇身 void creatfood(); //创建随机出现食物 int biteself(); //判断是否咬到自己 void cantcrosswall(); //设置蛇撞墙情况 void speedup(); //加速 void speeddown(); //减速 void snakemove(); //前进方向 void keyboardcontrol(); //键盘按键 void lostdraw(); //游戏结束界面 void endgame(); //游戏结束 void choose(); //游戏结束选择 void File_out(); //在文件中读取最高分 void File_in(); //存储最高分 void explation(); //游戏说明 int color(int c) //设置文字颜色 { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); return 0; } void gotoxy(int x,int y) { COORD pos; //定义结构体 pos.X=x; pos.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } void printsnake() { //color(6); //gotoxy(35,1); //printf("/^\\/^\\"); //gotoxy(34,2); //printf("|_| o|"); printf(" / ^\\ /^\\ \n"); printf(" _|__| O | \n"); printf(" \\/ /~ \\_/ \\ \n"); printf(" \\____|__________/ \\ \n"); printf(" \\_______ \\ \n"); printf(" `\\ \\ \\ \n"); printf(" | | \\ \n"); printf(" / / \\ \n"); printf(" / / \\ \n"); printf(" / / \\ \\ \n"); printf(" / / \\ \\ \n"); printf(" / / _----_ \\ \\ \n"); printf(" / / _-~ ~-_ | | \n"); printf(" ( ( _-~ _--_ ~-_ _/ | \n"); printf(" \\ ~-____-~ _-~ ~-_ ~-_-~ / \n"); printf(" ~-_ _-~ ~-_ _-~ \n"); printf(" ~--______-~ ~-___-~ "); } //欢迎界面 void welcometogame() { int n; int i,j=1; color(11); gotoxy(43,18); printf("贪吃蛇大作战"); color(14); for(i=20;i<=26;i++) { for(j=27;j<=74;j++) { gotoxy(j,i); if(i==20||i==26) { printf("-"); } else { if(j==27||j==74) { printf("|"); } } } } color(12); gotoxy(35,22); printf("1.开始游戏"); gotoxy(55,22); printf("2.游戏说明"); gotoxy(35,24); printf("3.退出游戏"); color(3); gotoxy(29,27); printf("请选择[1,2,3]:[ ]\b\b"); color(14); scanf("%d",&n); switch(n) { case 1: system("cls"); creatmap(); initsnake(); creatfood(); break; case 2: explation(); break; case 3: exit(0); break; } } //地图 void creatmap() { int i,j; for(i=0;i<58;i+=2) { gotoxy(i,0); color(8); printf("▓"); gotoxy(i,26); printf("▓"); } for(i=1;i<26;i++) { gotoxy(0,i); printf("▓"); gotoxy(56,i); printf("▓"); } for(i=2;i<56;i+=2) { for(j=1;j<26;j++) { gotoxy(i,j); color(15); printf("█\n\n"); } } } //右侧信息 void scoreandtips() { File_out(); //键盘控制函数时调用,每次变化 color(11); gotoxy(64,4); printf("☆最高纪录:%d",highscore); color(14); gotoxy(64,8); printf("得分:&d",score); color(13); gotoxy(73,11); printf("小提示"); color(6); gotoxy(60,13); printf("╬┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╬"); gotoxy(60,25); printf("╬┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╬"); color(3); gotoxy(64,14); printf("每个食物得分:%d分",add); gotoxy(64,16); printf("不能穿墙,咬到自己"); gotoxy(64,18); printf("使用上下左右键移动"); gotoxy(64,20); printf("F1加速,F2减速"); gotoxy(64,22); printf("space:暂停游戏"); gotoxy(64,24); printf("Esc:退出游戏"); } //在文件中读取最高分 void File_out() { FILE *fp; fp = fopen("save.txt","a+"); fscanf(fp,"%d",&highscore); fclose(fp); } //蛇身 void initsnake() { snake *tail; int i; tail=(snake*)malloc(sizeof(snake)); //从蛇尾开始(初始化指针,开辟蛇尾空间) tail->x=24; //蛇尾(24,5) tail->y=5; for(i=1;i<=2;i++); //蛇头24+2i,5 { head=(snake*)malloc(sizeof(snake)); //初始化蛇头 head->next=tail; //蛇头的下一位为蛇尾 head->x=24+2*i; //设置蛇头位置 head->y=5; tail=head; //蛇头变成蛇尾,然后重复循环 } while(tail!=NULL) //只要蛇尾不为空,输出蛇身 { gotoxy(tail->x,tail->y); color(14); //蛇颜色 printf("♀"); //输出蛇身 // tail=tail->next; //一直输出蛇尾下一位 } } //食物 void creatfood() { snake *food_1; food_1=(snake*)malloc(sizeof(snake)); //动态分配空间为snake型数据大小的空间 并且将返回的指针类型强制转换成snake型指针 srand((unsigned)time(NULL)); //初始化随机数 while((food_1->x%2)!=0) //食物x坐标随机出现 保证食物只出现在网格中间 { food_1->x=rand()%52+2; //食物x坐标2-53 } food_1->y=rand()%24+1; q=head; while(q->next==NULL) //循环整个蛇身 { if(q->x==food->x && q->y==food->y) //蛇头的xy值坐标与食物的相等 { free(food_1); //释放食物指针,重合 creatfood(); //重新创建 } q=q->next; //查找蛇身上任何一个位置坐标不能重合 } gotoxy(food_1->x,food_1->y); food=food_1; color(12); printf("●"); //输出食物 } //判断是否咬到了自己 int biteself() { snake *self; //定义self为蛇身上的一个节点 //self是蛇头之外的蛇身上的节点 self=head->next; while (self != NULL) { if (self->x == head->x && self->y == head->y) { return 1; } self = self->next; } return 0; } //不能穿墙 void cantcrosswall() { if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26) { endgamestatus = 1; endgame(); } } void speedup() { if(sleeptime>=50) { sleeptime-=10; add+=2; } } void speeddown() { if(sleeptime<350) { sleeptime+=30;//减速时时间间隔加30 add-=2; if(sleeptime==350) { add=1; //保证最低分为1 } } } void snakemove() { snake *nexthead; cantcrosswall(); nexthead=(snake*)malloc(sizeof(snake)); //为下一步开辟空间 if(status==U) { nexthead->x=head->x; //向上前进时,x坐标不动,蛇头y坐标-1 nexthead->y=head->y-1; nexthead->next=head; head=nexthead; q=head; //指针q指向蛇头 if(nexthead->x==food->x && nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("♀"); //原来食物的位置,从●换成♀ q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作 } score=score+add; //加上食物的分 speedup(); creatfood(); } else { while(q->next->next!=NULL) //不遇食物 { gotoxy(q->x,q->y); color(14); printf("♀"); //蛇正常往前走,输出当前位置的蛇身 q=q->next; } gotoxy(q->next->x,q->next->y); //经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置 color(3); printf("■"); free(q->next); //进行输出■之后,释放指向下一位的指针 q->next=NULL; //指针下一位指向空 } } if(status==D) { nexthead->x=head->x; //向下前进时,x坐标不动,y坐标+1 nexthead->y=head->y+1; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } score=score+add; speedup(); creatfood(); } else { while(q->next->next!=NULL) //没遇食物 { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } gotoxy(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(status==L) { nexthead->x=head->x-2; //向左前进时,x坐标左移2,y坐标不动 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } score=score+add; speedup(); creatfood(); } else { while(q->next->next!=NULL) //没遇食物 { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } gotoxy(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(status==R) { nexthead->x=head->x+2; //向左前进时,x坐标左移2,y坐标不动 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } score=score+add; speedup(); creatfood(); } else { while(q->next->next!=NULL) //没遇食物 { gotoxy(q->x,q->y); color(14); printf("♀"); q=q->next; } gotoxy(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(biteself()==1) //判断是否会咬到自己 { endgamestatus=2; endgame(); } } void keyboardcontrol() { status=R; //初始蛇向右移动 while(1) { scoreandtips(); if(GetAsyncKeyState(VK_UP) && status!=D) //GetAsyncKeyState函数用来判断函数调用时指定虚拟键的状态 { status=U; //如果蛇不是向下前进的时候,按上键,执行向上前进操作 } else if(GetAsyncKeyState(VK_DOWN) && status!=U) //如果蛇不是向上前进的时候,按下键,执行向下前进操作 { status=D; } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) //如果蛇不是向右前进的时候,按左键,执行向左前进 { status=L; } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) //如果蛇不是向左前进的时候,按右键,执行向右前进 { status=R; } if(GetAsyncKeyState(VK_SPACE)) //按暂停键,执行pause暂停函数 { Sleep(300); //进程暂停,知道达到里面设定的参数的时间。 if(GetAsyncKeyState(VK_SPACE)) //按空格键暂停 { break; } } else if(GetAsyncKeyState(VK_ESCAPE)) { endgamestatus=3; //按esc键,直接到结束界面 break; } else if(GetAsyncKeyState(VK_F1)) //按F1键,加速 { speedup(); } else if(GetAsyncKeyState(VK_F2)) { speeddown(); } Sleep(sleeptime);//暂停sleeptime后继续往下执行,加上头文件windows.h后直接用, snakemove(); } } //失败界面 void Lostdraw() { int i; system("cls"); gotoxy(45,2); color(6); printf("\\\\\\|///"); gotoxy(43,3); printf("\\\\"); gotoxy(47,3); color(0); printf(".-.-"); gotoxy(54,3); color(6); printf("//"); gotoxy(44,4); color(14); printf("("); gotoxy(47,4); color(0); printf(".@.@"); gotoxy(54,4); color(14); printf(")"); gotoxy(17,5); color(11); printf("+------------------------"); gotoxy(35,5); color(14); printf("oOOo"); gotoxy(39,5); color(11); printf("----------"); gotoxy(48,5); color(14); printf("(_)"); gotoxy(51,5); color(11); printf("----------"); gotoxy(61,5); color(14); printf("oOOo"); gotoxy(65,5); color(11); printf("-----------------+"); for(i = 6;i<=19;i++) //竖边框 { gotoxy(17,i); printf("|"); gotoxy(82,i); printf("|"); } gotoxy(17,20); printf("+---------------------------------"); gotoxy(52,20); color(14); printf("☆☆☆"); gotoxy(60,20); color(11); printf("----------------------+"); } void endgame() { system("cls"); if(endgamestatus==1) { gotoxy(43,9); color(12); printf("GAME OVER !"); } else if(endgamestatus==2) { gotoxy(43,9); color(12); printf("GAME OVER !"); } else if(endgamestatus==3) { gotoxy(40,9); color(12); printf("游戏已结束"); } gotoxy(43,12); color(13); printf("你的得分是 %d",score); if(score>=highscore) { File_in(); } choose(); } void File_in() { FILE *fp; fp = fopen("save.txt","w+"); fscanf(fp,"%d",score); fclose(fp); } //边框下面的分支选项 void choose() { int n; gotoxy(25,23); color(12); printf("Continue ------ 1"); gotoxy(52,23); printf("Exit ------ 2"); gotoxy(45,25); color(11); printf("选择: "); scanf("%d", &n); switch (n) { case 1: system("cls"); score=0; //分数归零 sleeptime=200; //设定初始速度 add = 10; //使add设定为初值,吃一个食物得分10,然后累加 printsnake(); welcometogame(); break; case 2: exit(0); //退出游戏 break; default: gotoxy(35,27); color(12); printf(" 输入有误 重新输入!"); system("pause >nul");//将显示的内容重定向到nul,不显示按任意键退出,pause会显示按任意键退出 endgame(); choose(); break; } } void explation() { system("cls"); color(13); gotoxy(30,8); printf("1. 不能穿墙,不能咬到自己"); color(10); gotoxy(30,11); printf("2. 用↑.↓.←.→分别控制蛇的移动"); color(14); gotoxy(30,14); printf("3. F1 为加速,F2 为减速"); color(11); gotoxy(30,17); printf("4. 按空格键暂停游戏,再按空格键继续"); color(4); gotoxy(30,20); printf("5. ESC :退出游戏.space:暂停游戏"); getch(); //按任意键返回主界面 system("cls"); printsnake(); welcometogame(); } int main() { system("mode con cols=100 lines=30"); printsnake(); welcometogame(); File_out(); keyboardcontrol(); endgame(); return 0; } ``` 哪位大神能解决的话能不能附上详细解决方式,代码 快要交了,救命呐

delphi断点无效,自动跳过代码

//定义 type PlayerInfo = record //客户端信息 ID: pchar; GameHwnd: int64; //游戏句柄 ClientHwnd: int64; //dll的窗体句柄 Account: pchar; //账号 PassWord: pchar; //密码 RealmName_1: pchar; //服务器 RealmName_2: pchar; playername:pchar; Team:pchar;//队伍 Task:pchar;//功能 CmdCode:pchar; Gamepath:pchar; end; pplayerinfo = ^playerinfo; var pplayer: PlayerInfo; {这个将会已指针的方式传递给线程, 它应该是全局的} T_Event: Cardinal = 0; //事件内核 function LoginGame(ptr: pointer): boolean; stdcall; //登录游戏的线程 var i, c: Integer; num: integer; //ID hmodule: thandle; installkeyProc: function(hwindow: hwnd): boolean; gamehprocess, module: Cardinal; gameh, childhwnd, filehwnd: int64; TextFile: TStringList; filepath: string; Curp: PlayerInfo; {因为指针参数给的点随时都在变, 需用线程的局部变量存起来} //临时变量 ID: pchar; GameHwnd: int64; //游戏句柄 ClientHwnd: int64; //dll的窗体句柄 Account: pchar; //账号 PassWord: pchar; //密码 RealmName_1: pchar; //服务器 RealmName_2: pchar; playername:pchar; Team:pchar;//队伍 Task:pchar;//功能 CmdCode:pchar; Gamepath:pchar; begin EnterCriticalSection(CS); //进入临界区 try result := False; Curp := pPlayerInfo(ptr)^; //这里开始往下断点无效,会自动跳过 ID:=Curp.ID; //这个createthread传递进来的结构体,参数多了,传递的值会出错 ClientHwnd:=Curp.ClientHwnd; Account:=Curp.Account; PassWord:=Curp.PassWord; RealmName_1:=Curp.RealmName_1; RealmName_2:=Curp.RealmName_2; playername:=Curp.playername; Team:=Curp.Team; task:=Curp.Task; //直到这里可以下断点,中间这一块全部跳过 cmdcode:=Curp.CmdCode; Gamepath:=Curp.Gamepath; SetEvent(T_Event); //设置触发 filepath := Gamepath + '\data\config.ini'; if FileExists(filepath) then begin //如果文件存在,则进行修改和添加 TextFile := TStringList.Create; TextFile.LoadFromFile(filepath); for I := 0 to TextFile.Count - 1 do begin if Pos('SaveAccount', TextFile[i]) > 0 then begin TextFile.Delete(i); TextFile.Insert(i, 'SaveAccount = ' + '0'); end; end; TextFile.SaveToFile(filepath); if TextFile <> nil then begin TextFile.Free; TextFile := nil; end; end; //参数一:进程路径 //参数二:命令行 //参数八:子进程工作路径 if createprocess(pchar(gamepath+'\asktao.mod'), pChar('des:'+CmdCode), nil, nil, False, 0, nil, gamepath, StartupInfo, ProcessInfo) then begin gameh := GetHwndFromProcess(ProcessInfo.dwProcessId); for c := 0 to 60 do begin if gameh = 0 then begin Sleep(1000); gameh := GetHwndFromProcess(ProcessInfo.dwProcessId); end else break; end; end; if gameh > 0 then begin if KeyHook(gameh) then FormMain.Memo1.Lines.Add('dll安装成功'); //安装完成后,客户端窗体会创建一个DLL窗体,类名为Tform1 //遍历所有进程,跟进程ID相同,并且窗体类名为Tform1 //则代表dll窗体初始化成功,可以发送Data告诉他去登陆 for c := 0 to 30 do begin childhwnd := GetChildwindows(ProcessInfo.dwProcessId); if childhwnd > 0 then begin Break; end else Sleep(1000); end; //成功创建窗口,可以开始发送数据,并让他开始自动登陆 //如果child窗口为0,则表示登陆失败,或者creatprocess开始是循环 //失败了重新再开一个窗口,记得关闭这个窗口 end; result := True; Isloading := false; LeaveCriticalSection(CS); //离开临界区 ExitThread(0); except result := false; ExitThread(0); end; end; procedure TFormMain.Button1Click(Sender: TObject); var i: integer; num: integer; UserIni: TIniFile; list: tstringlist; filepath: string; sr: TSearchRec; Section, Key: string; { 分别表示 ini 文件的小节与关键字 } begin filepath := ExtractFilePath(Application.ExeName); filepath := filepath + '\区组信息.ini'; if not fileExists(filepath) then begin MessageBox(Handle, '服务器列表文件丢失', '错误信息', 0); Exit; end; for i := 0 to FormMain.listview1.Items.Count - 1 do begin if FormMain.ListView1.Items[i].Checked = True then begin num := StrToInt(FormMain.ListView1.Items[i].Caption); pplayer.ID := pchar(inttostr(num)); pplayer.GameHwnd := 0; pplayer.ClientHwnd := self.Handle; pplayer.Account := pchar(FormMain.ListView1.Items[i].SubItems[0]); pplayer.PassWord := pchar(FormMain.ListView1.Items[i].SubItems[1]); pplayer.RealmName_1 := pchar(FormMain.ListView1.Items[i].SubItems[2]); pplayer.RealmName_2 := pchar(FormMain.ListView1.Items[i].SubItems[3]); pplayer.playername := pchar(FormMain.ListView1.Items[i].SubItems[4]); pplayer.Team:= pchar(FormMain.ListView1.Items[i].SubItems[5]); pplayer.task:= pchar(FormMain.ListView1.Items[i].SubItems[9]); pplayer.Gamepath:=pchar(formmain.Edit游戏路径.text); //根据服务器列表设置 UserIni := TIniFile.Create(filepath); // 判断文件大小 if FindFirst(filepath, faAnyFile, sr) = 0 then begin if sr.size > 0 then begin // 如果文件不为空 section:='DES'; key:=pplayer.RealmName_1; pplayer.CmdCode:=pchar(userini.ReadString(section,key,'')); end else begin MessageBox(Handle, '服务器列表文件丢失', '错误信息', 0); FindClose(sr); if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; Exit; end; end; //关闭由FindFirstFile函数创建的一个搜索句柄 FindClose(sr); if UserIni <> nil then begin UserIni.Free; UserIni := nil; end; hthread := createthread(nil, 0, @LoginGame, @pplayer, 0, threadid); if WaitForSingleObject(T_Event, INFINITE) = WAIT_OBJECT_0 then ResetEvent(T_Event); //设置为未触发 CloseHandle(hthread); end; end; end; 不知道为什么,logingame线程,传递的自定义结构体参数过多,会传递不正确,而且其中有注释的地方会断点无效,运行起来会自动跳过这段代码,求大神解救,谢谢。。

哪位大神帮忙看一下下面的这个代码的addlist函数部分有什么问题?以及leaveTop函数有什么问题。。。跪谢

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdlib.h> using namespace std; #define ElemType int #define null 0 #define MAXSIZE 100 #define TempSpace 10 typedef struct Link {//定义停车场链表结构体 ElemType data; //定义数据域 struct Link* next; //定义指针域 }Link; Link* head; Link* end; void List_init(Link* head)//初始化链表 { head = (Link*)malloc(sizeof(Link)); head->next = NULL; } void AddList(Link *lot,ElemType a)//停车场单链表增加结点 { //创建一个节点 Link* temp = (Link*)malloc(sizeof(struct Link)); //此处注意强制类型转换 Link* rear = (Link*)malloc(sizeof(struct Link));//头结点 rear = lot; while (rear->next!=NULL) { rear = rear->next; } //节点数据进行赋值 temp->data = a; temp->next = NULL; rear->next = temp; //连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上 //if (NULL == head) //{ // head = temp; //end = temp; //} //else //{ //end->next = temp; //end = temp; //尾结点应该始终指向最后一个 //} //end = temp; //尾结点应该始终指向最后一个 } void LeaveStop(Link* L, ElemType x, ElemType n) {//删除指定元素的结点 Link* p; Link* q; p = L->next; for (int i=0; i <= x; i++) { if (p->data == n) { q = p->next; p->next = q->next; free(q); } else { p = p->next; } } } typedef struct Node ///定义等候车道队列的结点 { ElemType data; struct Node* next; }Node; typedef struct LQueue // 定义等候车道队列 { Node* front;//队头结点 Node* rear;//队尾结点 }LQueue; void init(LQueue* que) //初始化队列(只需初始化LQueue,即队头结点与队尾结点) { que = (LQueue*)malloc(sizeof(LQueue)); que->front = NULL; que->rear = NULL; } int isEmpty(LQueue* que) //等候车道是否满了 { if (que->front == NULL && que->rear == NULL) { return 1; } else { return 0; } } void push(LQueue& que, ElemType x) //等候车道入队 { Node* node = (Node*)malloc(sizeof(Node)); node->data = x; node->next = NULL; que.rear = node; } void pop(LQueue* que, ElemType x) //等候车道出队 { Node* temp = (Node*)malloc(sizeof(Node)); temp = que->front; x = que->front->data; que->front = que->front->next; free(temp);//释放p结点 } int waitingArea(LQueue Q, int carnum) //判断车是否在等候区 { if (Q.front = Q.rear) return 0;//等候区没有车 while (Q.front != null) { if (Q.front->data == carnum) return 1; Q.front = Q.front->next; } return 0; } int main() { ElemType number; int selection = 1;//定义操作选项 int choice1 = 1; //是否进入停车场的选项 int choice2 = 1;//选择离开停车场出口的选项 int choice3 = 1;//选择从哪个入口进入停车场的选项 int choice4 = 1;//选择从哪个便车道离开的选项 int parking_car = 0;//正在停车场内停的车的数量 int waiting_car_south = 0;//正在南出口等候车道的车辆数量 int waiting_car_north = 0;//正在北出口等候车道的车辆数量 int parking_max = 100;//最多可以停放多少车辆 int flag = 1;//用于执行循环的整数值 LQueue park_north; init(&park_north);//初始化北等候通道 LQueue park_south; init(&park_south);//初始化南等候通道 Link lot; List_init(&lot); //初始化停车场 printf("*******************欢迎使用停车场管理系统,按任意键进入主菜单******************\n"); printf(""); do { getchar(); system("cls"); printf("*******************欢迎使用停车场管理系统,按任意键进入主菜单\n"); printf(" 主菜单 \n"); printf(" *1* 汽车入场 \n"); printf(" *2* 汽车离场 \n"); printf(" *3* 车位查询 \n"); printf(" *4* 离开车道 \n"); printf(" *0* 退出系统 \n"); printf(" 请按提示输入数字:\n"); scanf("%d", &selection); switch (selection) { case 1://汽车入场的选项 system("cls"); printf("***********************************汽车入场************************************\n"); if (parking_car < MAXSIZE)//停车场有空位 { printf(" 请输入您的车辆编号:\n"); scanf("%d", &number); AddList(&lot,number); printf(" 欢迎您进入本停车场!\n"); parking_car++;//停车场内部车辆 getchar(); break; } else if ((waiting_car_south < TempSpace || waiting_car_north < TempSpace) && parking_car == MAXSIZE)//停车场没有空位,但等候车位有空位 { int car_num = waiting_car_south + waiting_car_north; printf("***********当前停车场已停满,有%d辆车在等待,请问是否愿意进入等候车道**********\n", &car_num); printf(" *1*\t愿意等待 *0*\t离开停车场\n"); getchar(); while (flag == 1)//进入choice1的循环 { scanf("%d", &choice1); getchar(); switch (choice1) { case 1: printf(" 请您进入等候车道等待\n");//需要加入选择哪个入口的switch getchar(); printf("***********************************请选择进入停车场的入口************************\n"); printf(" *1*\t南入口 *2*\t北入口\n"); scanf("%d", &choice3); switch (choice3) { case 1: printf(" 您进入南入口等待,您排在等待通道的第%d位\n", &waiting_car_south); printf(" 请输入您的车辆编号:\n"); scanf("%d", number); push(park_south, number); waiting_car_south++; printf("*******************按任意键再次进入主菜单******************\n"); getchar(); break; case 2: printf(" 您进入北入口等待,您排在等待通道的第%d位\n", &waiting_car_north); printf(" 请输入您的车辆编号:\n"); scanf("%d", number); push(park_north, number); waiting_car_north++; printf("*******************按任意键再次进入主菜单******************\n"); getchar(); break; } flag = 0; break; case 2: printf(" 您已离开停车场\n"); getchar(); flag = 0; break; default: printf(" 2输入错误,请您重新输入!\n"); getchar(); break; } } } else if (waiting_car_south == TempSpace && waiting_car_north == TempSpace && parking_car == MAXSIZE)//停车场没有空位,但等候车位有空位 { printf(" 车位已满请重新选择功能\n"); getchar(); break; } break; case 2://汽车离场的选项 if (parking_car > 0) { system("cls"); printf("***********************************请选择离开停车场的出口************************\n"); printf(" *1*\t南出口 *2*\t北出口\n"); while (flag == 1)//进入choice2的循环 { scanf("%d", &choice2); printf(" 请输入您的车辆编号:\n"); scanf("%d", number); switch (choice2) { case 1: if (isEmpty(&park_south)) { printf(" 您已离开停车场\n"); LeaveStop(&lot, MAXSIZE, number); parking_car--; } else { printf(" 南出口现在有%d辆车正在等候\n", waiting_car_south); waiting_car_south++; parking_car--; push(park_south, number); flag = 0; getchar(); } break; case 2: if (isEmpty(&park_north)) { printf(" 您已离开停车场\n"); LeaveStop(&lot, MAXSIZE, number); parking_car--; } else { printf(" 北出口现在有%d辆车正在等候\n", waiting_car_north); waiting_car_north++; parking_car--; push(park_north, number); flag = 0; getchar(); } break; default: printf(" 3输入错误,请您重新输入!\n"); getchar(); break; } } } else { printf(" 停车场内没有车辆\n"); printf(" 请重新选择功能\n"); getchar(); break; } break; case 3://车位查询 system("cls"); printf("**********************************停车场信息************************************\n"); if (parking_car == MAXSIZE)//停车场已经停满 { printf(" 停车场已经停满\n"); getchar(); break; } else//停车场车辆未满 { printf(" 现在停车场中有%d辆汽车,有%d个可用车位\n", parking_car, parking_max - parking_car); printf(" 南出口现在有%d辆车正在等候\n", waiting_car_south); printf(" 北出口现在有%d辆车正在等候\n", waiting_car_north); getchar(); break; } case 4: printf("***********************************请选择离开停车场的出口************************\n"); printf(" *1*\t南出口 *2*\t北出口\n"); while (flag == 1)//进入choice2的循环 { scanf("%d", &choice4); switch (choice4) { case 1: if (isEmpty(&park_south) == 1) { printf(" 等候车道为空,请您重新输入!\n"); getchar(); break; } else { printf(" 请输入您的车辆编号:\n"); scanf("%d", &number); if (waitingArea(park_south, number) == 1) { pop(&park_south, number); waiting_car_south--; printf(" 您已离开南出口\n"); getchar(); break; } else { printf(" 该车辆并不在南出口:\n"); getchar(); break; } } case 2: if (isEmpty(&park_north) == 1) { printf(" 等候车道为空,请您重新输入!\n"); getchar(); break; } else { if (waitingArea(park_north, number) == 1) { pop(&park_north, number); waiting_car_north--; printf(" 您已离开南出口\n"); getchar(); break; } else { printf(" 该车辆并不在南出口:\n"); getchar(); break; } } default: printf(" 输入错误,请您重新输入!\n"); getchar(); break; } } case 0://离开停车场 system("cls"); printf(" 请输入您的车辆编号:\n"); scanf("%d", &number); LeaveStop(&lot, MAXSIZE, number); printf(" 您已离开停车场\n"); parking_car--; getchar(); break; default: printf(" 输入错误,请您重新输入!\n"); getchar(); break; } } while (choice1 != 0); return 0; }

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪

CopyOnWriteArrayList.java和ArrayList.java,这2个类的构造函数,注释中有一句话 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ArrayList(Collection&lt;? ...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

SpringBoot系列之Redis缓存使用详细教程

Spring的缓存抽象 Spring从3.1开始定义了一系列抽象接口来统一不同的缓存技术;并支持使用Java Caching(JSR-107)注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。 JSR107 Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, Cach...

推荐9个能让你看一天的网站

分享的这9个保证另你意外的网站,每个都非常实用!非常干货!毫不客气的说,这些网站最少值10万块钱。 利用好这些网站,会让你各方面的技能都得到成长,不说让你走上人生巅峰,但对比现在的你,在眼界、学识、技能方面都有质的飞跃。 一、AIRPANO 传送门:https://www.airpano.com/360photo_list.php 这是一个可以躺在家里,就能环游世界的神奇网站。 世界那么大,绝大多...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

月薪22K程序员,打卡迟到10次,收到工资短信一脸懵逼

每家公司为了保证公司员工每天的工作时间,一般都会采用上下班打卡的工作制度,这其实是一个很常见的是,本身也没有什么问题的。正所谓无规矩不成方圆,公司肯定是有公司的规矩,虽然每个员工都很不喜欢这些规矩来束缚我们,但是公司也只是为了能更好的管理员工。但是一家公司如果一成不变的使用打卡制度,而不会去变通管理,也真不一定是好事。 打卡制度特别对于销售部门来说,不但会让公司发展不起来,还很容易丢失员工。但如...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

程序员是做全栈工程师好?还是专注一个领域好?

昨天,有位大一的同学私信我,说他要做全栈工程师。 我一听,这不害了孩子么,必须制止啊。 谁知,讲到最后,更确定了他做全栈程序员的梦想。 但凡做全栈工程师的,要么很惨,要么很牛! 但凡很牛的,绝不是一开始就是做全栈的! 全栈工程师听起来好听,但绝没有你想象的那么简单。 今天听我来给你唠,记得帮我点赞哦。 一、全栈工程师的职责 如果你学习编程的目的只是玩玩,那随意,想怎么学怎么学。...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

十个摸鱼,哦,不对,是炫酷(可以玩一整天)的网站!!!

文章目录前言正文**1、Kaspersky Cyberthreat real-time map****2、Finding Home****3、Silk – Interactive Generative Art****4、Liquid Particles 3D****5、WINDOWS93****6、Staggering Beauty****7、Ostagram图片生成器网址****8、全历史网址*...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

​能让德国人放弃现金支付​,也没谁了

在新冠疫情中,德国人越来越多地选择在超市,加油站或其他商店付款时使用非接触式付款方式。德国信贷协会Deutschen Kreditwirtschaft (DK) 的一位发言人告诉德国新...

大厂的 404 页面都长啥样?最后一个笑了...

每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?猿妹搜罗来了下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意: 正在上传…重新上传取消 腾讯 正在上传…重新上传取消 网易 淘宝 百度 新浪微博 正在上传…重新上传取消 新浪 京东 优酷 腾讯视频 搜...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

原来实现钉钉自动签到如此简单,每天准时上下班不是梦

本文主要介绍了如何利用现成软件快速实现钉钉自动签到功能,核心思路非常简单,甚至无任何编程基础的小白也能轻松实现定时自动打卡功能.

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

讲真,这两款idea插件,能治愈你英语不好的病

时不时就有小伙伴问我,“二哥,能推荐一款 IDE 吗?”你看这话问的,现在搞 Java 的不都在用 Intellij IDEA 吗,还用得着推荐(我已经和 Eclipse 分手了)。然后小伙伴又说,“二哥,IDEA 支持中文吗?我英语不太好。”你看这话问的,搞编程的,英语不好是硬伤啊! 不过,随着 IDEA 最新版(版本号是 2020.1)的发布,英语不好的病可以彻底治愈了。为什么这么说呢?因为 ...

面试官给我挖坑:a[i][j] 和 a[j][i] 有什么区别?

点击上方“朱小厮的博客”,选择“设为星标”后台回复&#34;1024&#34;领取公众号专属资料本文以一个简单的程序开头——数组赋值:int LEN = 10000; int[][] ...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问