//循环链表,从某一位置遍历打印
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
typedef struct node {
int val; //数据
struct node* next;
}node,*linklist;
linklist init() {
node* L;
L = (linklist)malloc(sizeof(node));
L->next = L;
return L;
}
void creatlist(linklist L, int length) {
linklist p = (linklist)malloc(sizeof(node));
linklist tail = (linklist)malloc(sizeof(node));
tail = L;
int x;
for (int i = 0; i < length-1; i++) {
p = (linklist)malloc(sizeof(node));
scanf("%d ", &x);
p->val;
tail->next = p;
tail = p;
tail->next = L->next;
}
scanf("%d\n", &x);
p->val;
tail->next = p;
tail = p;
tail->next = L->next;
}
linklist getnode(linklist L, int num) {
linklist p2;
p2 = L;
int i = 0;
while (1) {
p2 = p2->next;
i++;
if (i == num) return p2;
}
}
void print(linklist L, linklist node) {
linklist p = node;
printf("%d", p->val);
p = p->next;
while (p != node) {
printf("%d", p->val);
p = p->next;
}
}
int main() {
linklist L= (linklist)malloc(sizeof(node));
int length;
scanf("%d\n", &length);
creatlist(L, length);
int num;
int a, b;
scanf("%d %d", &a, &b);
num = a;
linklist node = getnode(L, num);
print(L, node);
return 0;
}
我的结果:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<wchar.h>
typedef struct node {
int val; //数据
struct node* next;
}node,*linklist;
linklist init() {
node* L;
L = (linklist)malloc(sizeof(node));
L->next = L;
return L;
}
void creatlist(linklist L, int length) {
linklist p = (linklist)malloc(sizeof(node));
linklist tail = (linklist)malloc(sizeof(node));
tail = L;
int x;
for (int i = 0; i < length-1; i++) {
p = (linklist)malloc(sizeof(node));
scanf("%d ", &x);
p->val;
tail->next = p;
tail = p;
tail->next = L->next;
}
scanf("%d\n", &x);
p->val;
tail->next = p;
tail = p;
tail->next = L->next;
}
linklist getnode(linklist L, int num) {
linklist p2;
p2 = L;
int i = 0;
while (1) {
p2 = p2->next;
i++;
if (i == num) return p2;
}
}
void print(linklist L, linklist node) {
setlocale(LC_ALL, "zh_CN.utf8"); // 设置字符编码
linklist p = node;
wprintf(L"%d", p->val);
p = p->next;
while (p != node) {
wprintf(L"%d", p->val);
p = p->next;
}
}
int main() {
linklist L= (linklist)malloc(sizeof(node));
int length;
scanf("%d\n", &length);
creatlist(L, length);
int num;
int a, b;
scanf("%d %d", &a, &b);
num = a;
linklist node = getnode(L, num);
print(L, node);
return 0;
}
供参考:
//循环链表,从某一位置遍历打印
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int val; //数据
struct node* next;
}node,*linklist;
linklist init() {
node* L;
L = (linklist)malloc(sizeof(node));
L->next = L;
return L;
}
void creatlist(linklist L, int length) {
linklist p; //= (linklist)malloc(sizeof(node));修改
linklist tail; //= (linklist)malloc(sizeof(node));修改
tail = L;
int x;
scanf("%d", &x); //scanf("%d\n", &x); 修改
tail->val = x; //p->val; 修改
for (int i = 0; i < length-1; i++) {
p = (linklist)malloc(sizeof(node));
scanf("%d", &x); //scanf("%d ", &x); 修改
p->val = x; //p->val; 修改
tail->next = p;
tail = p;
tail->next = L; //L->next; 修改
}
//tail->next = p; 修改
//tail = p; 修改
//tail->next = L->next; 修改
}
linklist getnode(linklist L, int num) {
linklist p2;
p2 = L;
int i = 1; //修改 i = 0;
while (1) {
p2 = p2->next;
i++;
if (i == num) return p2;
}
}
void print(linklist L, linklist node) {
linklist p = node;
printf("%d", p->val);
p = p->next;
while (p != node) {
printf("%d", p->val);
p = p->next;
}
}
int main() {
linklist L = init(); //= (linklist)malloc(sizeof(node)); 修改
int length;
scanf("%d", &length); //scanf("%d\n", &length); 修改
creatlist(L, length);
int num;
int a, b;
scanf("%d %d", &a, &b);
num = a;
linklist node = getnode(L, num);
print(L, node);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:在这次旅程的终点,我们将实现一个名为CMM(即C Minus Minus)语言的编译器,这个编译器的输出将是由我们自己设计的一套指令集中的指令所构成的指令文件。所以,我们还将实现一套虚拟机程序,以运行编译器输出的指令文件。
CMM语言是一门将C语言的语法进行缩减后得到的语言。其主要特点如下:
只有一种类型:int
支持赋值、四则运算与比较运算
支持if、while语句
支持函数
支持数组
区分全局作用域与局部作用域
接下来,就让我们深入编译器前端一探究竟吧。请看下一章: