2016-07-13 7 views
-2

から生徒のレコードを削除する:これは私がリンクリスト内の特定の生徒のレコードを削除するために書かれているコードは、単一リンクリスト

int delete (struct student **q, struct student s,char *n) { 
    if(*q==NULL) 
    { 
     printf("The linked list is empty\n"); 
     return 0; 
    } 
    struct student *prev=*q; 
    while(prev->link!=NULL && prev->link!=n) 
    { 
     prev=prev->link; 
    } 
    if(prev->link==NULL) 
    { 
     printf("Student %s not found\n",n); 
     return 0; 
    } 
    prev->link=prev->link->link; 
    free(n); 
    return 1; 
} 

しかし、私は、while文のためcomparison of distinct pointer types lacks a cast [enabled by default]を知らせる警告メッセージを取得していますwhile(prev->link!=NULL && prev->link!=n)

は、これは構造体である:

struct student 
{ 
    int id; 
    char name[10]; 
    char gender[10]; 
    struct student * link; 
}*head; 

n店舗bに持っている学生の名前eが削除されました。

+0

を 'prev->リンク、また'構造体student' –

+2

私たちを見る= N 'ということは何ですかどういう意味ですか? –

+0

nはchar *ですが、prev-> linkは生徒*ですので、strcmp(prev-> link-> name、n)== 0のような学生名を比較したいと思います。 –

答えて

0

あなたのコードでは実際にはうまくいきません。

あなたは、リンクリストからchar * nと一致する構造体全体を削除したいと思います。あなたがするchar * nと、構造体を比較することはできませんので、このループは間違ってい

while(prev->link!=NULL && prev->link!=n) 
{ 
    prev=prev->link; 
} 

あなたは最初のものはそれ以外の場合は残るでしょう、あなたの文字列と一致していないかどうかを確認する必要があります。最初のものが一致する場合は、構造体の先頭を再割り当てする必要があります。そのため、関数の宣言で** qを使用します(正しく影響を与えてください)。私はループをこのように書くでしょう

struct student *prev = *q; 
if (strcmp(prev->name, n) == 0) 
{ 
    *q = (*q)->link; 
    prev->link = NULL; //not compulsory, but a good habit to take 
    free(prev); 
} 

:最初のチェックは次のようになりますCで

while(prev->link != NULL && strcmp(prev->link->name, n) != 0)) 
    { 
     prev = prev->link; 
    } 

を、次の2つの文字列を比較するためにはstrcmp()を使用する必要があります。 「一致」しない場合、「一致」は同一のままです。

次に、メモリ割り当てに関するいくつかの問題があります。固定ポインター(名前[10]など)を解放することはできませんが、割り当てられたメモリーだけを解放することはできません。 だから、最後には、もし無試合後、私は次のようになり、その「他」の助言:!

else 
{ 
    struct student matched_student = prev->link; 
    prev->link = prev->link->link; 
    matched_student->link = NULL; 
    free(matched_student); 
} 
0

私はprev->linkのタイプはstruct student *ですが、nの種類は、あなたが警告を修正するために

static_cast<char *>(prev->link) != n 

または

(char *)(prev->link) != n 

を使用することができますので、これらのタイプは、異なっている、char *だと思います。

+0

本当にありがとうございます..エラーはクリアされています。学生のレコードを削除するのではなく、リンクされたリストが空のまま出力されています。 – aish

関連する問題