实现链表基本操作,发生段错误
这是我的代码:#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;
} 球球各位大佬,做了好久都没解决 本帖最后由 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代入参数是链表头还是任意元素? jhq999 发表于 2021-12-20 20:58
把函数想实现的功能注释出来,看你代码都不知道你想干啥!Node *begin代入参数是链表头还是任意元素 ...
这是链表头 本帖最后由 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]