习题3.10-汉诺塔的非递归实现-编程题

习题3.10-汉诺塔的非递归实现-编程题

解题代码

#include<stdio.h>
#include<stdlib.h>
typedef struct Node* pNode;
struct Node {
	int cnt;
	char start;
	char pass;
	char end;
};
typedef struct stack* pstack;
struct stack {
	pNode data;
	pstack next;
};
typedef struct list* plist;
struct list {
	pstack head;
};
plist newlist(void);
pstack firststack(int N);
void pop(plist L);
void trinode(plist L);
int main()
{
	int N, i, flag = 1;
	scanf("%d", &N);
	plist L = newlist();
	L->head->next = firststack(N);
	while (L->head->next) {
		if (L->head->next->data->cnt==1) {
			if (flag) flag = 0;
			else printf("\n");
			pop(L);
		}
		else {
			trinode(L);
		}
	}
	return 0;
}
plist newlist(void) {
	plist L = (plist)malloc(sizeof(struct list));
	L->head = (pstack)malloc(sizeof(struct stack));
	L->head->next = NULL;
	return L;
}
pstack firststack(int N) {
	pstack S = (pstack)malloc(sizeof(struct stack));
	S->next = NULL;
	S->data = (pNode)malloc(sizeof(struct Node));
	S->data->cnt = N;
	S->data->start = 'a';
	S->data->pass = 'b';
	S->data->end = 'c';
	return S;
}
void pop(plist L) {
	printf("%c -> %c", L->head->next->data->start, L->head->next->data->end);
	pstack p = L->head->next;
	L->head->next = p->next;
	free(p);
}
void trinode(plist L) {
	pstack p = L->head->next;
	p->data->cnt--;
	char temp = p->data->start;
	p->data->start = p->data->pass;
	p->data->pass = temp;
	pstack p1 = (pstack)malloc(sizeof(struct stack));
	pstack pn = (pstack)malloc(sizeof(struct stack));
	pn->next = p1;
	p1->next = p;
	L->head->next = pn;
	pn->data = (pNode)malloc(sizeof(struct Node));
	p1->data = (pNode)malloc(sizeof(struct Node));
	pn->data->cnt = p->data->cnt;
	p1->data->cnt = 1;
	p1->data->start = p->data->pass;
	p1->data->pass = p->data->start;
	p1->data->end = p->data->end;
	pn->data->pass = p1->data->end;
	pn->data->end = p1->data->pass;
	pn->data->start = p1->data->start;
}

测试结果

在这里插入图片描述

问题整理

1.
	typedef struct list* plist;
	struct list {
		pstack head;
	};//这段代码确实多此一举,原本结构里还有其他东西,被我删掉了。。
2.注意在结构体中嵌套结构体时,push新结点时要逐层申请结构体的内存,不能遗漏。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值