鱼C论坛

 找回密码
 立即注册
查看: 1064|回复: 2

这个为什么、 一输入0就错误?scanf不是可以接受0,吗?

[复制链接]
发表于 2022-12-14 20:34:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
S$XDT1N{ZS_)2%Y0_H)G)1R.png
#include <stdio.h>
#include <stdlib.h>

struct Node{
        int num;
        struct Node *next;
};

void function(void);
void ds_init(struct Node **head);
int ds_insert(struct Node **head, int i);
void ds_delete(struct Node **head, int i);
int ds_search(struct Node *head, int i);
void print(struct Node *head);
int ClerrList(struct Node **head);

void function(void){
        printf("1.初始化链表\n");
        printf("2.插入结点\n");
        printf("3.删除结点\n");
        printf("4.查找结点\n");
        printf("5.遍历链表\n");
        printf("0.退出\n");
}

void ds_init(struct Node **head){
        int i;
        struct Node *node;
        struct Node *temp;

        printf("输入结点的值,输入-1完成初始化\n");

        while(1){
                scanf("%d", &i);
                if (i == -1){
                        return ;
                }

                if (!(*head)){//        !(*head) --> *head == NULL
                        *head = (struct Node *)malloc(sizeof(struct Node));
                        if(!(*head)){
                                exit(1);
                        }
                        (*head)->num = i;
                        (*head)->next = *head;
                }
                else{
                        for (node = (*head); node->next != (*head); node = node->next)
                                ;
                        temp = (struct Node *)malloc(sizeof(struct Node));
                        if(!(*head)){;
                                exit(1);
                        }

                        temp->num = i;
                        temp->next = *head;
                        node->next = temp;
                }
        }
}

int ds_insert(struct Node **head, int i){
        int j, k = 1;
        struct Node *node;
        struct Node *now;
        struct Node *temp;

        printf("请输入要插入的结点的值");
        scanf("%d", &j);

        if (i == 1){//新插入的结点作为第一个结点
                now = (struct Node *)malloc(sizeof(struct Node));
                if(!now){
                        exit(1);
                }
                now->num = j;
                for (node = *head; node->next != *head; node = node->next)//找到最后一个结点
                        ;

                now->next = *head;
                node->next = now;//temp放到head前面
                *head = now; //head要指向第一个结点
        }
        else{
                node = *head;

                while ( ++k < i){
                        node = node->next;
                }

                now = (struct Node *)malloc(sizeof(struct Node));
                if(!now){
                        exit(1);
                }
                now->num = j;

                temp = node->next;
                node->next = now;
                now->next = temp;
        }
        return j;
}

void ds_delete(struct Node **head, int i){
        int j = 1;
        struct Node *node;
        struct Node *temp;

        if (i == 1){//删除的第一个结点
                for (node = *head; node->next != (*head); node = node->next)//找到最后一个结点
                        ;

                temp = *head;
                *head = (*head)->next;
                node->next = *head;
                free(temp);
        }
        else{
                node = *head;

                while ( ++j < i){
                        node = node->next;
                }

                temp = node->next;
                node->next = temp->next;
                free(temp);
        }
}

int ds_search(struct Node *head, int i){
        int j = 1;
        struct Node *node;

        for (node = head; node->next != head && node->num != i; j++){//找到最后一个结点
                node = node->next;
        }

        if (node->next == head)
                return 0;
        else
                return j;
}

void print(struct Node *head){//遍历
        struct Node *node;
        int i = 0;

        node = head;

        do{
                printf("%d ", node->num);
                node = node->next;
        }while (node != head);
        putchar('\n');
}

int ClerrList(struct Node **head){//将单链表清空
        struct Node *node, *temp;

        node = *head;
        while (node){
                temp = node;
                node = node->next;
                free(temp);
                /*temp = node->next;
                free(node);
                node = temp;*/
        }
        if (node)
                return 0;
        else
                (*head)->next = NULL;

        return 1;
}

int main(){
        char i;
        int j;
        struct Node *head = NULL;

        function();
        while (1){
                printf("请输入指令:");
                scanf("%c", &i);
                printf("__________");
                switch (i){
                        case '1': ds_init(&head);
                                print(head);break;
                        case '2': printf("请输入要插入的位置:");
                                scanf("%d", &j);
                                printf("再位置%d插入%d后:", j, ds_insert(&head, j));
                                print(head);break;
                        case '3': printf("请输入要删除的位置:");
                                scanf("%d", &j);
                                ds_delete(&head, j);
                                printf("删除第%d个结点后:", j);
                                print(head);break;
                        case '4': printf("请输入查找的值:");
                                scanf("%d", &j);
                                printf("元素%d所在的位置:%d\n", j, ds_search(head, j));break;
                        case '5': print(head);break;
                        case '0': ClerrList(&head);exit(1);
                }
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-14 23:01:30 | 显示全部楼层
抱歉技术不够没法帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-16 09:28:54 | 显示全部楼层
我这里编译运行一切正常,应该是你的编译出了问题,代码没有任何问题
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表