重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

線形リストについてのプログラムを作ったのですが、挿入部分、削除部分がうまくいきません。
また、内容を表示させる関数を作りたいのですがどのようにすれば良いか思いつきません。
ご教授お願いしたいです。
プログラム内容としては、自己参照構造体を使い、ダミーヘッダを用いて線形リストを作りたいです。
一応ダミーヘッダを用いずに自己参照構造体ではないやり方はできたのですが、こちらに取り掛かってみるとうまく行きませんでした…

#include<stdio.h>
#include<stdlib.h>
typedef int DATA;
typedef struct node {
DATA data;
struct node *next;
}NODE;
NODE *create(void);
char access(NODE *L, int i);
void insert(NODE *L, int i, char x);
void delete(NODE *L, int i);
void initialize(NODE *L);
int empty(NODE *L);
/* list.c */
NODE *create(void){
NODE *pos;
NODE *newNode;
NODE head;
pos= &head;
newNode =malloc(sizeof(NODE));
newNode -> next=pos ->next;
pos ->next=newNode;
return(pos);
}
char access(NODE *L, int i){
if(L->next!=NULL){
if(i>1){
return(access(L->next,i-1));
}
else{
return(L->next->data);
}
}else{
printf("L ends before arriving at the position.\n");
return('\0');
}
}
void insert(NODE *L, int i,char x){
NODE *p;
if(L!=NULL){
if(i>1){
insert(L->next,i-1,x);
}
else{
p=create();
p->data=x;
p->next=L->next;
L->next=p;
}
}
else{
printf("L ends before arriving at the position.\n");
}
}
void delete(NODE *L,int i){
NODE *pos;//削除したいノード
NODE *prevNode;//削除したいノードの前
NODE *del;
prevNode -> next=pos->next;
free(pos);
}
void initialize(NODE *L){
while(!empty(L)){
delete(L,1);
}
}
int empty(NODE *L){
if(L->next==NULL){
return(1);
}
return(0);
}
int main(void){
int c;
int flag;
flag=1;
c=1;
NODE *L;
int a,b,d;
a=0;
b=0;
d=0;
L=create();
while(c!=9){
if(flag==1){
printf("\n1.Insert, 2.Delete, 9.Quit:");
/*コマンド入力*/
scanf("%d",&c);
}
switch(c){
case 1:
printf("どこの場所に挿入?\n");
scanf("%d",&b);
insert(L,b,a);
a++;

break;
case 2:
printf("どこの場所を削除?\n");
scanf("%d",&d);
delete(L,d);

break;
case 9:
break;
default:
printf("\nwrong number.\n");
}
}
printf("\n");
free(L);
return(0);
}

A 回答 (3件)

ダミーヘッダであることを明示するため、


main の変数は L ではなく dummyHead 等とする。名前は大事

create は malloc で確保したアドレスを返すこと
また、ここでは next の処理は不要。insert でやる

// i=1 が先頭の意味なら、i番目Nodeの一つ前を探す処理は
NODE* p = L;
for (a=1; a<i; a++) {
_ p = p->next;
_ if (p == NULL) i番目の一つ前が存在しないエラー発生()
}
// i=1 なら p == dummyHead
// i=2 なら p == 1番目Node

// insert は
NODE* x = create(値)
x->next = p->next
p->next = x

// delete は
NODE* x = p->next
if (x == NULL) i番目が存在しないエラー発生()
p->next = x->next
free(x)

// access は
NODE* x = p->next
if (x == NULL) i番目が存在しないエラー発生()
return x->data

最後の free は、dummyHead から末端Nodeまですべて処理すること
    • good
    • 0
この回答へのお礼

参考にして書いてみましたが、どう改善すればよいのか、うまく行きません…
i番目Nodeの一つ前を探す場合はどこの関数に書いたらいいでしょうか。
また、if(p==NULL)の場合、printfエラー発生、みたいに表示させるだけで良いですか?

お礼日時:2021/06/11 18:44

まあ delete がおかしいのは明らか. 引数をどこで使ってるよ.



あと create も不自然ではある. たぶん間違ってるだろうけど.

それぞれの操作で
・操作前にどうなって「いるはず」なのか
・操作後にどうなって「いなければならない」のか
を図にすることを勧める.

あとなんで char なんだろう.
    • good
    • 0

ここを参考にしてみれば良いですよ。



線形リスト:
https://www.cc.kyoto-su.ac.jp/~yamada/ap/list.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!