いろんな場所で聞いていましたが、結局完成しませんでした_|‾|○
皆さんの力ください(;∀;)
リストから削除する、関数del_listを作成する。
という事なのですが、実行できたものの削除したと出たのに
実際削除されませんでした。★で囲まれてる場所があやしいので
もしよろしければ、ご教授お願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list{
char name[100];
struct list *next;//自己参照構造体
}NODE;
void list_out(NODE *);
void add_list(NODE);//リストの登録
NODE *del_list(NODE);//リストの削除
NODE *head;//先頭ポインタ
void main(void)
{
NODE adddata;
NODE deldata,*p;
printf("***文字列の昇順に登録***\n");
printf("文字列入力 (CTRL+Zで終了)\n");
head = NULL;
while(printf("->"),gets(adddata.name) !=NULL){
add_list(adddata);
}
printf("***リストの削除***\n");
list_out(head);
printf("\n*** リストの削除 ***\n");
printf("削除文字列入力\n");
while(printf("->"),gets(deldata.name) !=NULL){
if((★p=del_list(deldata)★) ==NULL)
printf("未発見\n");
else
printf("%p番地のノードを削除\n",p);
}
printf("***リストの内容***\n");
list_out(head);
}
void list_out(NODE *p)
{
while(p != NULL){
printf("%p番地:%s\n",p,p->name);
p=p->next;
}
}
void add_list(NODE adddata)
{
NODE *new,*p,*back;
new = (NODE *)malloc(sizeof(NODE));
if(new == NULL){
printf("メモリエラー");
exit(1);
}
strcpy(new->name,adddata.name);//文字列登録
if(head == NULL || strcmp(new->name,head->name) < 0){//リストの先頭なら
/*ポインタのつなぎ換え*/
new->next=head;
head=new;
}
else{
p=head;//挿入場所を探す先頭から調べましょう
while(p != NULL && strcmp(new->name,p->name) >= 0){//自分以下の間繰り返す
back=p;
p=p->next;
}
/*ポイントのつなぎ替え*/
new->next= p;
back->next=new;
}
}
NODE *del_list(NODE deldata)
{
NODE *p,*back;
if★(head == NULL)★return NULL;//リストが空なら、NULLを戻す
if★(strcmp(deldata.name,head->name)){★//リストの先頭なら
/*ポインタのつなぎ換え*/
back = head;
★head = head->next;★
return ★head;★
}
else{
p=head;//削除するノードを探す
while(★p != NULL && strcmp(deldata.name,p->name) >= 0★){
back=p;
p=p->next;
}
/*pポインタの繋ぎ換え*/
if(p != NULL)★head->next= p;★
return p;
}
}
誰かがといてくれるまでマルチポストしづつけるなこりゃ。。。
back を用途を考えてみ。
strcmpの使用も調べなおしてみ。
そのリストへの入力はソート済みが保証されてるのか?
#マルチポストは反感をかう。回答者の多くは複数の掲示板を見てるから
#それに気づくし不快にもなる。質問するたびに回答が得られにくくなる。
マルチ必死だなwwww
もう君にC言語無理だよw
ツイート | ![]() |