循环链表打印出现乱码

//循环链表,从某一位置遍历打印
#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;
}

我的结果:

img


应该修改哪里呀?

#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;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7600833
  • 这篇博客也不错, 你可以看下求整数序列中出现次数最多的数
  • 除此之外, 这篇博客: 如何实现一个简易版语言编译器?中的 3. 我们将要实现什么 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这次旅程的终点,我们将实现一个名为CMM(即C Minus Minus)语言的编译器,这个编译器的输出将是由我们自己设计的一套指令集中的指令所构成的指令文件。所以,我们还将实现一套虚拟机程序,以运行编译器输出的指令文件。

    CMM语言是一门将C语言的语法进行缩减后得到的语言。其主要特点如下:

    • 只有一种类型:int

    • 支持赋值、四则运算与比较运算

    • 支持if、while语句

    • 支持函数

    • 支持数组

    • 区分全局作用域与局部作用域

    接下来,就让我们深入编译器前端一探究竟吧。请看下一章:

  • 您还可以看一下 王剑老师的站长必修课:网站是怎样做出来的?课程中的 希望有一天你能成为他们...小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^