C语言 提问 编程问题求答

img


有没有人解释下这是干什么啊?还有循环体里的自增那个在干什么?需要帮忙

这就是你随便输入任意多个整数,统计正整数,0和负整数各自的数量
没输入一个数,就会提问你一下是不是还需要继续输入整数,如果输入Y表示继续输入,输入N表示输入结束。
自增就是在计数啊。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7666209
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言不完全类型是什么?有什么用途?
  • 除此之外, 这篇博客: C语言实现判别有向图(采用邻接表为存储结构)中是否存在有向环,当有向环存在时,输出构成环的顶点中的 一、源码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 思路及其详细解释看另一篇:关于图的第二题

    #include<stdio.h>
    #include<stdlib.h>
    
    //定义图的结构体
    #define MaxVexNum 100
    typedef struct ArcNode{//边表结点
    	int data;
    	struct ArcNode *next;
    }ArcNode;
    typedef struct VNode{//顶点表结点
    	int data,indegree,outdegree;//indegree、outdegree分别是该顶点的入度和出度,data为顶点号
    	struct ArcNode *first;
    	bool visited;//访问标记
    }VNode;
    typedef struct Graph{
    	VNode adjlist[MaxVexNum];
    	int vexnum,arcnum;
    }Graph;
    
    //定义栈的结构体以及相关操作
    typedef struct{
    	VNode data[MaxVexNum];
    	int top;
    }Stack;
    void InitStack(Stack &s){
    	s.top = -1;
    }
    bool StackEmpty(Stack s){//判栈空
    	if(s.top == -1){
    		return true;
    	}else{
    		return false;
    	}
    }
    
    bool Push(Stack &s,VNode x){//进栈
    	if(s.top == MaxVexNum-1){
    		return false;
    	}else{
    		s.data[++s.top] = x;
    		return true;
    	}
    }
    
    VNode Pop(Stack &s){//出栈
    	return s.data[s.top--];
    	
    }
    
    
    int location(Graph *G,int data){//定位顶点号为data在adjlist中的下标
    	int i;
    	for(i = 0;i<G->vexnum;i++){
    		if(G->adjlist[i].data == data){
    			return i;
    		}
    	}
    	return -1;
    }
    
    Graph *creat_Graph(){//创建一个图
    	int i,j,start;
    	Graph *G = (Graph *)malloc(sizeof(Graph));
    	ArcNode *p;
    	printf("请输入图的顶点数:");
    	scanf("%d",&G->vexnum);
    	for(i = 0;i<G->vexnum;i++){
    		G->adjlist[i].first = NULL;
    	}
    	printf("请输入图的边数:");
    	scanf("%d",&G->arcnum);
    	for(i = 0;i<G->vexnum;i++){
    		printf("请输入第%d个顶点:",i+1);
    		scanf("%d",&G->adjlist[i].data);
    	}
    	for(i = 0;i<G->arcnum;i++){
    		printf("输入边的起点:");
    		scanf("%d",&start);
    		for(j = 0;j<G->vexnum;j++){
    			if(G->adjlist[j].data == start){
    				p = (ArcNode *)malloc(sizeof(ArcNode));
    				p->next = NULL;
    				printf("输入边的终点:");
    				scanf("%d",&p->data);
    				p->next = G->adjlist[j].first;
    				G->adjlist[j].first = p;
    			}
    		}
    	}
    	return G;
    }
    
    void FindInDegree(Graph *G){  //计算每个顶点的入度
             int i;
             ArcNode *p;
             for (i=0;i<G->vexnum;i++)
                   G->adjlist[i].indegree=0;//初始化入度
             for (i=0;i<G->vexnum;i++)
             {
                 p=G->adjlist[i].first;
                 while(p){
    				 G->adjlist[location(G,p->data)].indegree++;
    				 p=p->next;
                 }
             }
    }
    
    void FindOutDegree(Graph *G){  //计算每个顶点的出度                                
             int i ;
             ArcNode *p;
             for (i=0;i<G->vexnum;i++)
                   G->adjlist[i].outdegree=0;//初始化出度
             for (i=0;i<G->vexnum;i++)
             {
                 p=G->adjlist[i].first;
                 while(p){
                       G->adjlist[i].outdegree++;
                       p=p->next;
                 }
             }
    }
    
    void main(){
    	int i,count = 0,j;//count记录被标记的顶点个数
    	Stack s;
    	VNode v;
    	ArcNode *q;
    	Graph *G = creat_Graph();
    	for(i = 0;i<G->vexnum;i++){//标记的初始化
    		G->adjlist[i].visited = false;
    	}
    	InitStack(s);//栈的初始化
    	FindInDegree(G);
    	FindOutDegree(G);
    	for(i = 0;i<G->vexnum;i++){//将出度或入度为0的顶点入栈并标记
    		if(G->adjlist[i].outdegree == 0||G->adjlist[i].indegree == 0){
    			Push(s,G->adjlist[i]);
    			G->adjlist[i].visited = true;
    		}
    	}
    	while(!StackEmpty(s)){
    		v = Pop(s);
    		count++;
    		for(q = v.first;q;q = q->next){//计算入度的变化
    	 		G->adjlist[location(G,q->data)].indegree--;
    	 	}
    	 	for(j = 0;j<G->vexnum;j++){//计算出度的变化就要对整个图的邻接表进行遍历了
    	 		for(q = G->adjlist[j].first;q;q = q->next){
    	 			if(q->data == v.data){
    	 				G->adjlist[j].outdegree--;
    	 			}
    	 		}
    	 	}
    		for(i = 0;i<G->vexnum;i++){//将出度或入度为0 且未被标记(即没有入过栈的)的顶点入栈
    			if((G->adjlist[i].outdegree == 0||G->adjlist[i].indegree == 0)&&G->adjlist[i].visited == false){
    				Push(s,G->adjlist[i]);
    				G->adjlist[i].visited = true;
    			}
    		}
    	}
    	if(count<G->vexnum){
    		printf("存在环\n");
    		printf("构成环的顶点为:");
    		for(i = 0;i<G->vexnum;i++){
    			if(G->adjlist[i].visited == false){
    				printf("%5d",G->adjlist[i].data);
    			}
    		}
    		printf("\n");
    	}else{
    		printf("不存在环\n");
    	}
    }
    
  • 您还可以看一下 黄强老师的掌握C语言链表课程中的 为什么需要链表?小节, 巩固相关知识点