qq_43210697
拍夕阳的相机
采纳率100%
2021-04-19 17:59 阅读 24

C无头结点建立链栈,指针指向错误

#include<stdio.h>

typedef int ElemType;
typedef struct Node {
	ElemType data;
	struct Node* next;
}Node;

//初始化
void InitNode(Node *D){
	D = NULL;
	printf("%d\n",D);
}
//判空
int NodeEmpty(Node* D) {
	if (D == NULL) {
		printf("栈为空\n");
		return 0;
	}
	else {
		printf("栈不为空\n");
		return 1;
	}
}
//插入元素
int InNode(Node* D, int x) {
	Node* New1 = (Node*)malloc(sizeof(Node));
	if (New1 == NULL) {
		return 0;
	}
	New1->data = x;
	New1->next = D;
	D = New1;
	printf("执行第之后,插入操作后D的值为:%d\n", D->data);
	return 1;
}
//出栈
int OutNode(Node* D) {
	if (D != NULL) {
		int x;//用于记录出栈值
		x = D->data;
		//用malloc建立的一定要free
		Node* De = (Node*)malloc(sizeof(Node));
		De = D;
		D = De->next;
		free(De);
		printf("出栈之后D.next=%d\n", D->data);
		return x;
	}
	else {
		printf("栈为空\n");
		return 0;
	}

}
//输出栈顶元素
int OutTopNode(Node* D) {
	if (D != NULL) {
		printf("栈顶模块内栈顶元素为:%d\n",D->data);
		return D->data;
	}
	else {
		printf("栈为空\n");
		return 0;
	}
}

void main() {
	Node D;
	InitNode(&D);
	InNode(&D, 1);
	NodeEmpty(&D);
	int OutPut1 = OutTopNode(&D);
	printf("第1次栈顶元素为%d\n",OutPut1);
	//int OUT1 = OutNode(&D);
	//printf("第1次出栈元素:%d\n", OutPut1);
	//int OutPut2 = OutTopNode(&D);
	//printf("第2次栈顶元素为%d\n", OutPut2);
	//NodeEmpty(&D);
}

显示指针指向负数

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    technologist_23 CSDN专家-cpp_learner 2021-04-20 09:04

    点个采纳吧!

    所以你要改成指针,然后函数参数改用二级指针,就可以了。

    #include<stdio.h>
    #include <malloc.h>
    
    typedef int ElemType;
    typedef struct Node {
    	ElemType data;
    	struct Node* next;
    }Node;
    
    //初始化
    void InitNode(Node **D) {
    	(*D) = (Node*)malloc(sizeof(Node));
    	(*D)->data = -1;
    	(*D)->next = NULL;
    	printf("%d\n", *D);
    }
    
    //判空
    int NodeEmpty(Node **D) {
    	if ((*D) == NULL) {
    		printf("栈为空\n");
    		return 0;
    	} else {
    		printf("栈不为空\n");
    		return 1;
    	}
    }
    //插入元素
    //int InNode(Node* D, int x) {
    //	Node* New1 = (Node*)malloc(sizeof(Node));
    //	if (New1 == NULL) {
    //		return 0;
    //	}
    //	New1->data = x;
    //	New1->next = D;
    //	D = New1;
    //	printf("执行第之后,插入操作后D的值为:%d\n", D->data);
    //	return 1;
    //}
    
    int InNode(Node **D, int x) {
    	Node* New1 = (Node*)malloc(sizeof(Node));
    
    	New1->data = x;
    	New1->next = (*D);
    	*D = New1;
    	printf("执行第之后,插入操作后D的值为:%d\n", (*D)->data);
    	return 1;
    }
    
    
    //出栈
    int OutNode(Node* D) {
    	if (D != NULL) {
    		int x;//用于记录出栈值
    		x = D->data;
    		//用malloc建立的一定要free
    		Node* De = (Node*)malloc(sizeof(Node));
    		De = D;
    		D = De->next;
    		free(De);
    		printf("出栈之后D.next=%d\n", D->data);
    		return x;
    	} else {
    		printf("栈为空\n");
    		return 0;
    	}
    
    }
    //输出栈顶元素
    int OutTopNode(Node **D) {
    	if ((*D) != NULL) {
    		printf("栈顶模块内栈顶元素为:%d\n", (*D)->data);
    		return (*D)->data;
    	} else {
    		printf("栈为空\n");
    		return 0;
    	}
    }
    
    void main() {
    	Node *D;
    	InitNode(&D);
    	InNode(&D, 1);
    	NodeEmpty(&D);
    	int OutPut1 = OutTopNode(&D);
    	printf("第1次栈顶元素为%d\n", OutPut1);
    	//int OUT1 = OutNode(&D);
    	//printf("第1次出栈元素:%d\n", OutPut1);
    	//int OutPut2 = OutTopNode(&D);
    	//printf("第2次栈顶元素为%d\n", OutPut2);
    	//NodeEmpty(&D);
    }
    点赞 评论 复制链接分享
  • software7503 CSDN专家-赖老师(软件之家) 2021-04-19 18:05

    写一些打印语句调试一下,关键的变量值打印出来看看。

    点赞 评论 复制链接分享
  • technologist_23 CSDN专家-cpp_learner 2021-04-20 08:59

    其实问题就出来这个插入这里,这里并没进行插入,当函数执行退出后,D还是原来那个D并没有数据插入。你可以打个断点看看。

    //插入元素
    int InNode(Node* D, int x) {
    	Node* New1 = (Node*)malloc(sizeof(Node));
    	if (New1 == NULL) {
    		return 0;
    	}
    	New1->data = x;
    	New1->next = D;
    	D = New1;
    	printf("执行第之后,插入操作后D的值为:%d\n", D->data);
    	return 1;
    }
    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-04-20 11:24

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-04-21 18:25

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    点赞 评论 复制链接分享
  • it_xiangqiang C和C++技术博客 2021-04-26 20:16

    C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
    C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

    点赞 评论 复制链接分享

相关推荐