鱼C论坛

 找回密码
 立即注册
查看: 576|回复: 4

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

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

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

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

x
这是我的代码:
#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[4][20] = {{"show"}, {"delete"}, {"insert"}, {"get"}};
        char str[20];
        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[i], 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-20 20:37:08 | 显示全部楼层
球球各位大佬,做了好久都没解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-20 20:58:19 | 显示全部楼层
本帖最后由 jhq999 于 2021-12-20 21:47 编辑
  1. Node *creat(int n) {
  2.         int count = 0;
  3.         Node *p1, *p2;//p2的意义是什么?
  4.         p2 = malloc(len);
  5.         p2->next = NULL;

  6.         while (--n) {//n=1时不进入循环
  7.                 p1 = malloc(len);
  8.                 scanf("%d", &p1->date);
  9.                 p1->next = p2->next;
  10.                 p2->next = p1;
  11.               
  12.         }

  13.         return p2;//应该返回p2
  14. }
复制代码
  1. void get(Node *begin, int n) {
  2.         Node *p1;
  3.         p1 = begin;
  4.         int i = 0;

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

  9.         if (p1 == NULL)
  10.                 printf("get fail\n");
  11.         else
  12.                 printf("%d\n", p1->date);
  13. }
复制代码


把函数想实现的功能注释出来,看你代码都不知道你想干啥!Node *begin代入参数是链表头还是任意元素?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是链表头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-20 23:08:23 | 显示全部楼层
本帖最后由 jhq999 于 2021-12-20 23:12 编辑
  1. Node *insert(Node *begin, int n, int x) {//返回值是表头
  2.         Node *front = NULL, *head, *move, *temp;
  3.         head = move = begin;
  4.         int i = 0;
  5.         if (move == NULL) {
  6.                 head =(Node *)malloc(len);
  7.                 head->date = x;
  8.                 head->next = NULL;
  9.                 return head;
  10.         }
  11.        /*if(0==n){//插表头前面
  12.                 head =(Node *)malloc(len);
  13.                 head->date = x;
  14.                 head->next = move;
  15.                 return head;
  16.        }*/
  17.         while (i < n && move) {
  18.                 front = move;
  19.                 move = move->next;
  20.                 i++;
  21.         }
  22.         temp=(Node *)malloc(len);//插在move前面
  23.         temp->date = x;
  24.         temp->next = move;
  25.         if(front)front->next =temp;
  26.         else head=temp;//插表头前面
  27.         return head;
  28.         
  29.         /*if (move) {
  30.                 if (front == NULL) {
  31.                         head = temp = malloc(len);
  32.                         temp->date = x;
  33.                         temp->next = move;
  34.                 } else {
  35.                         temp = malloc(len);
  36.                         temp->date = x;
  37.                         front->next = temp;
  38.                         temp->next = move;
  39.                 }
  40.         }
  41.         
  42.         return head;*/

  43. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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