6-3シングルチェーンテーブルノード削除(20点)
11434 ワード
この問題では、読み込んだデータを単一のチェーンテーブルに格納し、チェーンテーブルに所定の値が格納されているすべてのノードを削除する2つの関数を実現する必要があります.チェーンテーブルノードの定義は次のとおりです.
struct ListNode { int data; ListNode *next; };
関数インタフェースの定義:
struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );
関数readlistは、標準入力から一連の正の整数を読み込み、読み込み順に単一チェーンテーブルを作成します.−1を読むと入力が終了することを示し,関数は単一チェーンヘッダノードを指すポインタを返す.
関数deletemは、単一チェーンテーブルLにmが格納されているすべてのノードを削除します.結果チェーンヘッダノードを指すポインタを返します.審判試験プログラムのサンプル:
/*あなたのコードはここに埋め込まれます*/
サンプルを入力:
10 11 10 12 10 -1 10
出力サンプル:
11 12
struct ListNode { int data; ListNode *next; };
関数インタフェースの定義:
struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );
関数readlistは、標準入力から一連の正の整数を読み込み、読み込み順に単一チェーンテーブルを作成します.−1を読むと入力が終了することを示し,関数は単一チェーンヘッダノードを指すポインタを返す.
関数deletemは、単一チェーンテーブルLにmが格納されているすべてのノードを削除します.結果チェーンヘッダノードを指すポインタを返します.審判試験プログラムのサンプル:
#include
#include
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("
");
}
int main()
{
int m;
struct ListNode *L = readlist();
scanf("%d", &m);
L = deletem(L, m);
printlist(L);
return 0;
}
/*あなたのコードはここに埋め込まれます*/
サンプルを入力:
10 11 10 12 10 -1 10
出力サンプル:
11 12
struct ListNode *readlist(){
struct ListNode *p,*head,*tail;
head=NULL;
int score;
while(1){
p=(struct ListNode *)malloc(sizeof(struct ListNode ));
scanf("%d",&score);
if(score==-1)
break;
p->data=score;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
}
return head;
}
struct ListNode *deletem( struct ListNode *head, int min ){
struct ListNode * p1,* p2;
while(head!=NULL&&head->data==min){
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2!=NULL){
if(p2->data==min){
p1->next=p2->next;
free(p2);
}
else
p1=p2;
p2=p1->next;
}
return head;
}