C 双链表分段错误向后打印
我试图删除一个特定位置的节点,但我不断得到一个分段错误11 我正在从文件中读取位置和值 这是我的密码:C 双链表分段错误向后打印,c,file,doubly-linked-list,C,File,Doubly Linked List,我试图删除一个特定位置的节点,但我不断得到一个分段错误11 我正在从文件中读取位置和值 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { float val; struct node *prev; struct node *next; }node_t; void printForward(node_t *head) {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
float val;
struct node *prev;
struct node *next;
}node_t;
void printForward(node_t *head) {
node_t *current = head;
while (current != NULL) {
printf("%.2f\n", current->val);
current = current->next;
}
}
void printBackward(node_t *head) {
node_t *current = head;
while (current->next != NULL) {
current = current->next;
}
while (current != NULL) {
printf("%.2f\n", current->val);
current = current->prev;
}
}
void deleteAtPos(node_t **head, int pos) {
int i;
node_t *current = *head;
node_t *temp = NULL;
if (pos == 0) {
temp = (*head)->next;
free(*head);
(*head) = temp;
(*head)->prev = NULL;
return;
}
for (i = 0; i < (pos - 1); i++) {
if (current->next != NULL) {
current = current->next;
}
}
temp = current->next;
current->next = temp->next;
free(temp);
}
// Fix insert at position
void insertAtPos(node_t **head, int pos, float val) {
int i;
node_t *newNode = malloc(sizeof(node_t));
node_t *current = *head;
newNode->val = val;
if (pos == 0) {
newNode->next = (*head);
newNode->prev = NULL;
(*head)->prev = newNode;
(*head) = newNode;
return;
}
for (i = 0; i < pos; i++) {
if (current->next != NULL) {
current = current->next;
}
else {
printf("Node does not exist\n");
break;
}
}
current->prev->next = newNode;
newNode->prev = current->prev;
newNode->next = current;
current->prev = newNode;
}
void addEnd(node_t **head, float val) {
node_t *current = *head;
node_t *newNode = malloc(sizeof(node_t));
newNode->next = NULL;
newNode->val = val;
if (*head == NULL) {
*head = newNode;
newNode->prev = NULL;
return;
}
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
newNode->prev = current;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Error");
}
node_t *head = NULL;
FILE *fp;
int i = 0, x;
float valLine1, valLine2, valLine3;
char buffer[200], *token, *del = ",";
float posVals[200], delPos[200];
fp = fopen(argv[1], "r");
fgets(buffer, sizeof(buffer), fp);
token = strtok(buffer, del);
while (token != NULL) {
valLine1 = atof(token);
addEnd(&head, valLine1);
token = strtok(NULL, del);
}
printForward(head);
printf("\n");
del = ":,";
fgets(buffer, sizeof(buffer), fp);
token = strtok(buffer, del);
while (token != NULL) {
valLine2 = atof(token);
posVals[i] = valLine2;
token = strtok(NULL, del);
i++;
}
for (x = 0; x < i; x += 2) {
insertAtPos(&head, posVals[x + 1], posVals[x]);
}
printForward(head);
fgets(buffer, sizeof(buffer), fp);
i = 0;
token = strtok(buffer, del);
while (token != NULL) {
valLine3 = atof(token);
delPos[i] = valLine3;
token = strtok(NULL, del);
i++;
}
printf("\n");
for (x = 0; x < i; x++) {
deleteAtPos(&head, delPos[x]);
}
printForward(head);
printf("\n");
printBackward(head);
fclose(fp);
}
以下是该文件的内容:
17,32.5,12,0,34.6,-200.1,17,0.04,24
1:2,4.1:5,-12:4
3,5,0
请帮忙
谢谢您是说问题出在
deleteAtPos
上。但是您的代码离SSCCE很远,所以我不想为您隔离问题-您应该这样做,并且大多数情况下,在隔离过程中,您会找到答案。如果没有,你可以把问题贴在这里
因此,我将列出我所能看到的关于deleteAtPos
的错误,如果您修复了所有这些错误,问题将消失
*head
为空的情况,列表中有0个元素。这肯定是个错误pos>=0
pos
是列表末尾的情况。另一个断层您是说问题在于
deleteAtPos
。但是您的代码离SSCCE很远,所以我不想为您隔离问题-您应该这样做,并且大多数情况下,在隔离过程中,您会找到答案。如果没有,你可以把问题贴在这里
因此,我将列出我所能看到的关于deleteAtPos
的错误,如果您修复了所有这些错误,问题将消失
*head
为空的情况,列表中有0个元素。这肯定是个错误pos>=0
pos
是列表末尾的情况。另一个断层我已经修改了deleteAtPos()函数,现在您可以在任何位置删除,您的backward()函数将打印正确的值
void deleteAtPos(node_t **head, int pos) {
int i;
node_t *current = *head;
node_t *temp = NULL;
if (pos == 0) {
temp = (*head)->next;
free(*head);
(*head) = temp;
(*head)->prev = NULL;
return;
}
for (i = 0; i < (pos - 1); i++) {
if (current->next != NULL) {
current = current->next;
}
}
temp = current;
if(current->next==NULL)
{
current->prev->next = current->next;
}
else
{
current->prev->next = current->next;
current->next->prev = current->prev;
}
free(temp);
}
void deleteAtPos(节点头,内部位置){
int i;
节点_t*当前=*头部;
节点温度=NULL;
如果(位置==0){
温度=(*头部)->下一步;
自由(*头);
(*水头)=温度;
(*head)->prev=NULL;
返回;
}
对于(i=0;i<(位置-1);i++){
如果(当前->下一步!=NULL){
当前=当前->下一步;
}
}
温度=电流;
如果(当前->下一步==NULL)
{
当前->上一个->下一个=当前->下一个;
}
其他的
{
当前->上一个->下一个=当前->下一个;
当前->下一个->上一个=当前->上一个;
}
免费(临时);
}
我已经修改了deleteAtPos()函数,现在您可以在任何位置删除,您的backward()函数将打印正确的值
void deleteAtPos(node_t **head, int pos) {
int i;
node_t *current = *head;
node_t *temp = NULL;
if (pos == 0) {
temp = (*head)->next;
free(*head);
(*head) = temp;
(*head)->prev = NULL;
return;
}
for (i = 0; i < (pos - 1); i++) {
if (current->next != NULL) {
current = current->next;
}
}
temp = current;
if(current->next==NULL)
{
current->prev->next = current->next;
}
else
{
current->prev->next = current->next;
current->next->prev = current->prev;
}
free(temp);
}
void deleteAtPos(节点头,内部位置){
int i;
节点_t*当前=*头部;
节点温度=NULL;
如果(位置==0){
温度=(*头部)->下一步;
自由(*头);
(*水头)=温度;
(*head)->prev=NULL;
返回;
}
对于(i=0;i<(位置-1);i++){
如果(当前->下一步!=NULL){
当前=当前->下一步;
}
}
温度=电流;
如果(当前->下一步==NULL)
{
当前->上一个->下一个=当前->下一个;
}
其他的
{
当前->上一个->下一个=当前->下一个;
当前->下一个->上一个=当前->上一个;
}
免费(临时);
}
检查最后一个节点的逻辑。您将把值设置为Null,当前->下一步=临时->下一步。这是错误的是的,我也这么认为,我尝试了许多不同的方法,但我不能使它工作。实际上,我正试图将列表向后打印,这就是一直给我seg错误的原因。我是否需要在我的删除函数中对prev执行任何操作?为什么不在需要删除的节点之前停止循环?因为你必须这么做。也要维护上一个指针,或者只需复制下一个节点的内容,并对该节点而不是特定节点进行delate。检查上一个节点的逻辑。您将把值设置为Null,当前->下一步=临时->下一步。这是错误的是的,我也这么认为,我尝试了许多不同的方法,但我不能使它工作。实际上,我正试图将列表向后打印,这就是一直给我seg错误的原因。我是否需要在我的删除函数中对prev执行任何操作?为什么不在需要删除的节点之前停止循环?因为你必须这么做。也可以维护上一个指针,或者只复制下一个节点的内容,并对该节点而不是特定节点进行数据挖掘。