御坂19090 发表于 2022-12-15 19:16:52

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

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

jhq999 发表于 2022-12-15 19:16:53

御坂19090 发表于 2022-12-15 20:21
还是不行

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

      node = *head;
      while (node){//你怎么改成node->next
                temp = node;
                node = node->next;
                free(temp);
                /*temp = node->next;
                free(node);
                node = temp;*/
      }
      if (node)
                (*head)->next = NULL;
      else
                return 0;
      return 1;
}

lvk 发表于 2022-12-15 19:40:29

问题不在scanf那里,在ClerrList这个函数里,那个函数写的有问题

御坂19090 发表于 2022-12-15 20:14:57

lvk 发表于 2022-12-15 19:40
问题不在scanf那里,在ClerrList这个函数里,那个函数写的有问题

可是那个printf都没有执行

jhq999 发表于 2022-12-15 20:15:27

if (node)
               (*head)->next = NULL;
      else
               return 0;
               

御坂19090 发表于 2022-12-15 20:21:09

jhq999 发表于 2022-12-15 20:15


还是不行#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->next){
                temp = node;
                node = node->next;
                free(temp);
                /*temp = node->next;
                free(node);
                node = temp;*/
        }
        if (node)
                (*head)->next = NULL;
        else
                return 0;
        return 1;
}

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

        function();
        while (1){
                printf("请输入指令:");
                scanf("%c", &i);
                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;
}

lvk 发表于 2022-12-15 20:22:51

御坂19090 发表于 2022-12-15 20:14
可是那个printf都没有执行

错误到底是不是在ClerrList这个函数里,你调试一下,一步步执行不就知道了
页: [1]
查看完整版本: 这个为什么、 一输入0就错误?scanf不是可以接受0,吗?