
線形リストについてのプログラムを作ったのですが、挿入部分、削除部分がうまくいきません。
また、内容を表示させる関数を作りたいのですがどのようにすれば良いか思いつきません。
ご教授お願いしたいです。
プログラム内容としては、自己参照構造体を使い、ダミーヘッダを用いて線形リストを作りたいです。
一応ダミーヘッダを用いずに自己参照構造体ではないやり方はできたのですが、こちらに取り掛かってみるとうまく行きませんでした…
#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件)
- 最新から表示
- 回答順に表示
No.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まですべて処理すること
参考にして書いてみましたが、どう改善すればよいのか、うまく行きません…
i番目Nodeの一つ前を探す場合はどこの関数に書いたらいいでしょうか。
また、if(p==NULL)の場合、printfエラー発生、みたいに表示させるだけで良いですか?
No.2
- 回答日時:
まあ delete がおかしいのは明らか. 引数をどこで使ってるよ.
あと create も不自然ではある. たぶん間違ってるだろうけど.
それぞれの操作で
・操作前にどうなって「いるはず」なのか
・操作後にどうなって「いなければならない」のか
を図にすることを勧める.
あとなんで char なんだろう.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
int16_t の _t は何?
-
read関数をノンブロッキングで...
-
アスタリスクで正方形
-
【C++】関数ポインタの使い方
-
(int *)の意味
-
未解決の外部シンボル _printf...
-
C++でRPGを作成する際のステー...
-
acceptをalarmでタイムアウトさ...
-
C言語でDxlibを使って3x3の奇数...
-
C言語初心者です、、、お助けく...
-
c言語の問題です
-
C言語で秒単位の数値をコンソー...
-
VBからのDLL呼び出しでエラー発生
-
エラー 添字が付けられた値が、...
-
式は定数値が必要です」という...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報