清泓隐月 发表于 2021-12-20 20:36:12

实现链表基本操作,发生段错误

这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct LNode {
        int date;
        struct LNode *next;
} Node;
#define len sizeof(Node)
Node *creat(int n);
void output(Node *begin);
void get(Node *begin, int n);
Node *insert(Node *begin, int n, int x);
Node *delet(Node *begin, int n);

int main() {
        int n, ret, x, i;
        char ch = {{"show"}, {"delete"}, {"insert"}, {"get"}};
        char str;
        scanf("%d", &n);
        Node *begin;
        begin = creat(n);
        int count;
        scanf("%d", &count);

        while (count) {
                scanf("%s", str);

                for (i = 0; i < 4; i++)
                        if (strcmp(ch, str) == 0)
                                break;

                switch (i) {
                        case 0:
                                output(begin);
                                break;

                        case 1:
                                scanf("%d", &n);
                                begin = delet(begin, n);
                                break;

                        case 2:
                                scanf("%d%d", &n, &x);
                                begin = insert(begin, n, x);
                                break;

                        case 3:
                                scanf("%d", &n);
                                get(begin, n);
                                break;
                }

                count--;
        }

        return 0;
}

Node *creat(int n) {
        int count = 0;
        Node *p1, *p2;
        p2 = malloc(len);
        p2->next = NULL;

        while (n) {
                p1 = malloc(len);
                     scanf("%d", &p1->date);
                p1->next = p2->next;
                p2->next = p1;
                n--;
        }

        return p1;
}

void output(Node *begin) {
        Node *p1 = begin;
        int flag = 0;

        while (p1) {
                printf("%d ", p1->date);
                p1 = p1->next;
                flag = 1;
        }

        if (flag == 0)
                printf("Link list is empty\n");
        else
                putchar('\n');
}

void get(Node *begin, int n) {
        Node *p1;
        p1 = begin;
        int i = 0;

        while (i < n - 1 && p1) {
                p1 = p1->next;
                i++;
        }

        if (i > n || p1 == NULL)
                printf("get fail\n");
        else
                printf("%d\n", p1->date);
}

Node *insert(Node *begin, int n, int x) {
        Node *front = NULL, *head, *move, *temp;
        head = move = begin;
        int i = 0;

        while (i < n - 1 && move->next) {
                front = move;
                move = move->next;
                i++;
        }

        if (move == NULL) {
                head = malloc(len);
                head->date = x;
                head->next = NULL;
        }

        if (move) {
                if (front == NULL) {
                        head = temp = malloc(len);
                        temp->date = x;
                        temp->next = move;
                } else {
                        temp = malloc(len);
                        temp->date = x;
                        front->next = temp;
                        temp->next = move;
                }
        }

        return head;

}

Node *delet(Node *begin, int n) {
        Node *front = NULL, *move = begin, *head = begin;
        int i = 0, flag = 0;
        move = begin;

        while (i < n - 1 && move) {
                front = move;
                move = move->next;
                i++;
        }

        if (move == head && move) {
                head = head->next;
                flag = 1;
        } else if (move) {
                front->next = move->next;
                flag = 1;
        }

        if (flag)
                printf("delete OK\n");
        else
                printf("delete fail\n");

        return head;
}

清泓隐月 发表于 2021-12-20 20:37:08

球球各位大佬,做了好久都没解决

jhq999 发表于 2021-12-20 20:58:19

本帖最后由 jhq999 于 2021-12-20 21:47 编辑

Node *creat(int n) {
      int count = 0;
      Node *p1, *p2;//p2的意义是什么?
      p2 = malloc(len);
      p2->next = NULL;

      while (--n) {//n=1时不进入循环
                p1 = malloc(len);
                scanf("%d", &p1->date);
                p1->next = p2->next;
                p2->next = p1;
            
      }

      return p2;//应该返回p2
}
void get(Node *begin, int n) {
      Node *p1;
      p1 = begin;
      int i = 0;

      while (i < n && p1) {//当n=1时p1=begin->next;
                p1 = p1->next;
                i++;
      }

      if (p1 == NULL)
                printf("get fail\n");
      else
                printf("%d\n", p1->date);
}

把函数想实现的功能注释出来,看你代码都不知道你想干啥!Node *begin代入参数是链表头还是任意元素?

清泓隐月 发表于 2021-12-20 22:04:06

jhq999 发表于 2021-12-20 20:58
把函数想实现的功能注释出来,看你代码都不知道你想干啥!Node *begin代入参数是链表头还是任意元素 ...

这是链表头

jhq999 发表于 2021-12-20 23:08:23

本帖最后由 jhq999 于 2021-12-20 23:12 编辑

Node *insert(Node *begin, int n, int x) {//返回值是表头
      Node *front = NULL, *head, *move, *temp;
      head = move = begin;
      int i = 0;
      if (move == NULL) {
                head =(Node *)malloc(len);
                head->date = x;
                head->next = NULL;
                return head;
      }
       /*if(0==n){//插表头前面
                head =(Node *)malloc(len);
                head->date = x;
                head->next = move;
                return head;
       }*/
      while (i < n && move) {
                front = move;
                move = move->next;
                i++;
      }
      temp=(Node *)malloc(len);//插在move前面
      temp->date = x;
      temp->next = move;
      if(front)front->next =temp;
      else head=temp;//插表头前面
      return head;
      
      /*if (move) {
                if (front == NULL) {
                        head = temp = malloc(len);
                        temp->date = x;
                        temp->next = move;
                } else {
                        temp = malloc(len);
                        temp->date = x;
                        front->next = temp;
                        temp->next = move;
                }
      }
      
      return head;*/

}
页: [1]
查看完整版本: 实现链表基本操作,发生段错误