ここから本文です

リスト構造の削除についての質問です。 下のプログラムのdelete()関数の内容を教...

このエントリーをはてなブックマークに追加

質問者

takataka_0228さん

2010/11/116:19:42

リスト構造の削除についての質問です。
下のプログラムのdelete()関数の内容を教えていただけませんか?
標準入力から文字列を取得し、得た文字列に一致する構造体をリストから取り除き、使用していたメモリの解放。

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

struct person {
struct person *next;
char sex;
char *name;
int age;
};

struct person *phead = NULL, *ptail = NULL;

void insert(void);
void delete(void);
void printout(void);
void help(void);


int main(int argc, char **argv)
{
char buf[10];

while(1) {
fputs("Command(I/D/P/h)=", stdout);
if (fgets(buf, sizeof(buf), stdin) == NULL) {
printf("EOF\n");
break;
}
if (strcmp("I\n", buf) == 0)
insert();
else if (strcmp("D\n", buf) == 0)
delete();
else if (strcmp("P\n", buf) == 0)
printout();
else if (strcmp("h\n", buf) == 0)
help();
else printf("Unknown command =%s\n", buf);
}




}

void insert()
{
char buf[50];
struct person *p;

p = (struct person *)malloc(sizeof(struct person));
p->next= NULL;
while(1) {
fputs("Sex(M/F)=", stdout);
fgets(buf, sizeof(buf), stdin);
if (strcmp("M\n", buf) == 0) {
p->sex='M';
break;
} if (strcmp("F\n", buf) == 0) {
p->sex='F';
break;
} else printf("Input error: Please input M or F\n");
}
while(1) {
fputs("Name(max 20 bytes)=", stdout);
fgets(buf, sizeof(buf), stdin);
if (strlen(buf)>=20) {
printf("Input error: Over 20 bytes\n");
continue;
}
p->name=malloc(strlen(buf));
strncpy(p->name, buf, strlen(buf));
*(p->name+(strlen(buf)-1))='\0';
break;
}
while(1) {
fputs("Age(integer)=", stdout);
fgets(buf, sizeof(buf), stdin);
p->age=atoi(buf);
if(p->age >= 0 && p->age < 300) break;
printf("Input error: age is from 0 to 299\n");
}

if (phead == NULL) {
phead=p;
} else {
ptail->next=p;
}
ptail=p;

printf("++++++Inserted++++\n");

return;

}
void printout(){

struct person *p;



for(p=phead; p != NULL; p=p->next){
printf("sex=%c Name=%s Age=%d\n", p->sex, p->name, p->age);


}

}

void delete()
{
printf("Not available\n");
}

void help()
{
printf("\"I\" is insert data.\n \"D\" is delete data.\n \"P\" is print stored data.\n");

return;
}

閲覧数:
473
回答数:
1

違反報告

ベストアンサーに選ばれた回答

2010/11/122:11:43

得た文字列に一致する構造体というのが不明瞭なのですが、
とりあえず入力された文字列とnameが一致するノードを
削除対象としてみました。

void delete()
{
struct person *p = phead, *pprev = NULL;
char buf[50];

fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';

while (p != NULL) {
if (strcmp(buf, p->name) == 0) {
struct person *pdel = p;

if (p == phead) {
phead = p->next;
} else if (p == ptail) {
ptail = pprev;
pprev->next = NULL;
} else {
pprev->next = p->next;
}

p = p->next;
printf("delete: sex=%c Name=%s Age=%d\n", pdel->sex, pdel->name, pdel->age);
free(pdel->name);
free(pdel);
} else {
pprev = p;
p = p->next;
}
}
}

単方向リストなので、1つ前のノードへのポインタを
保持しておく必要があります。
また、ポインタをfreeした後は、指している内容が不定に
なってしまうので、リンクの貼り替えを先にする必要があります。

sexやageを対象にするものはご自身で考えてみてください。

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル
  • このエントリーをはてなブックマークに追加
簡単にみんなで作るショート動画アプリ Yahoo!Chocotle for Android(無料)

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する