0

VS とコードブロックの両方でプログラムをビルドしても問題はありません。一方、実行すると、インデックス番号を入力した後に壊れるか、文字が無限に表示されます...

#include<stdio.h>
#include<stdlib.h>


// list_node structure

typedef struct list_node{
    int item;
    struct list_node *next;
}ListNode;
//call functions that will be used 

void printNode(ListNode *head);
int removeNode(ListNode **ptrhead, int index);
ListNode *findNode(ListNode *head, int index);

int main(){
    int index,value;
    ListNode *head=NULL;
    ListNode *temp;
    //build the list  

    printf("Enter a value:");
    scanf("%d",&value);
    do{
              temp->item=value;
        if(head==NULL){
            head=(struct list_node *)malloc(sizeof(ListNode));
            temp=head;
        }
        else{
            temp->next=(struct list_node *)malloc(sizeof(ListNode));
            temp=temp->next;
        }
        printf("Enter a value:");
        scanf("%d",&value);

    }while(value!=-1);

    printf("Enter the index: ");
    scanf("%d",&index);
    // remove the node at the position indexed

    // when I used debugger, I saw it didn't execute this step. Maybe there's something wrong with it....

    removeNode(&head,index);

    printNode(head);

    return 0;
}


void printNode(ListNode *head){
    if (head==NULL)
        exit(0);
    while(head!=NULL){
        printf("%d",head->item);
        head=head->next;
    }
    printf("\n");
}

ListNode *findNode(ListNode *head,int index){
    if(head==NULL||index<0)
        return NULL;
    while(index>0){
        head=head->next;
        index--;
    }
    return head;
}


int removeNode(ListNode **ptrhead,int index){
    ListNode *pre,*cur,*temphead;

    temphead=*ptrhead;

    if(findNode(temphead,index)!=NULL){
        pre=findNode(temphead,index);
        cur=pre->next;
        temphead->next=cur;
        return 0;
    }
    else
        return -1;
}
4

4 に答える 4

0
int removeNode(ListNode **ptrhead,int index){
ListNode *pre,*cur;
if (index==-1)
    return 1;
else if(findNode((*ptrhead),(index))!=NULL){
    pre=findNode((*ptrhead),(index-1));
    cur=pre->next;
    pre->next=cur->next;
    return 0;
}
else
    return 1;
}

最後の部分を変更temp->next=NULLし、メイン関数に追加しました。このプログラムはすぐに実行できます。

于 2013-03-24T08:14:30.203 に答える
0
prev=NULL;
cur=head;
/* traverse the list until you find your target */
while (cur != NULL && cur->id != search_id) {
  prev=cur;
  cur=cur->next;
}
/* if a result is found */
if (cur != NULL) {
  /* check for the head of the list */
  if (prev == NULL)
    head=cur->next;
  else
    prev->next=cur->next;  
  /* release the old memory structure */
  free(cur);
}

どうしたんだ....私はあなたがそれを手に入れることを願っています... :)

于 2013-03-23T10:27:14.500 に答える
0

temp->item=value;-temp初期化されていないときに逆参照しています。未定義の動作、クラッシュ、バーン。

于 2013-03-23T10:27:52.963 に答える
0

あなたのループでは、

    temp->item=value;

temp にスペースが割り当てられていません。したがって、これはクラッシュします!!

    if(head==NULL){
        head=(struct list_node *)malloc(sizeof(ListNode));
        temp=head;

通常、tempノードを割り当てて、それを に割り当てheadますhead = temp。欠けているもう 1 つのポイントは、新しいノードが作成されたときです。次のnextように初期化する必要がありますNULLtemp->next = NULL

ではremoveNode

    if(findNode(temphead,index)!=NULL){
        pre=findNode(temphead,index);

pre削除するノードを指していますが、リストのtemphead指しているままです。を変更しません。そのため、常に変更しますheadfindNodetempheadtmphead->next = curhead

于 2013-03-23T10:30:12.380 に答える