解题代码
#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新结点时要逐层申请结构体的内存,不能遗漏。