鱼C论坛

 找回密码
 立即注册
查看: 668|回复: 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 编辑
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代入参数是链表头还是任意元素?
想知道小甲鱼最近在做啥?请访问 -> 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 编辑
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;*/

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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