C言語チェーンテーブル練習

4320 ワード

今日ちょうどC言语の构造体を话し终わって、数日后に试験して、复习して、Javaの学习は数日遅らせるべきで、先生はいくつかのチェーンテーブルについての练习を配置して、自分の手でコードの100行以上のコードを出して、记录して、その中のアルゴリズムはまた最适化を行うことができるべきで、しかしアルゴリズムに対して最适化して深く学习して、来学期までデータ构造を勉强したいと思って、今ただ実现することを求めます(:з」⑥)タイトル:1.チェーンテーブルaとbがあり、各ノードには学号、氏名、成績、プログラミングが含まれており、a表からb表に同じ学号があるノードを削除します.関数delでList(struct stsource,struct sttarget)実装.struct st{long num;char name[12];float socre;struct st* next}; 要求は同時に主調関数(main関数の実現)を与える2.1つのチェーンテーブルを逆順序で並べ替え、元のチェーンヘッダをチェーンヘッダとし、元のチェーンヘッダをチェーンヘッダとする.関数でinverted_List(struct st*head)実装;
注:del_List関数はヘッダポインタを操作する可能性があるので、ヘッダポインタのアドレスを入力する必要があります.したがって、形参はstruct st**sourceで、二重ポインタです.ここで先生のテーマが間違っているのではないでしょうか.
#include 
#include                      //  malloc         
struct st                               // typedef       ,     _(:з」∠)_ 
{
    long num;
    char name[12];
    float score;
    struct st * next;
};
void main()
{
    void creat_LinkList(struct st** Head,int n );
    void print_LinkList(struct st* Head );
    struct st * del_list (struct st **source,struct st* target);
    struct st* inverted_list(struct st*head);
    struct st* firstList = NULL,*secondList =NULL;      //        ,    
    creat_LinkList(&firstList,3);
    creat_LinkList(&secondList,2);
    //print_LinkList(firstList);
    //print_LinkList(secondList);
    del_list(&firstList,secondList);
    print_LinkList(firstList);
    printf("--------------------------");
    firstList = inverted_list(firstList);
    print_LinkList(firstList);
    
}

void creat_LinkList(struct st** Head,int n )    //    n         ,  head     ,         
{
    struct st *p ;
    p = (struct st*)malloc(sizeof(struct st));
    void print_LinkList(struct st* Head );
    *Head = p;
    printf("   1      ,  ,  
"); scanf("%d%s%f",&(p->num),&(p->name),&(p->score)); for (int i = 2;i <= n;i++) { p->next = (struct st*)malloc(sizeof(struct st)); p = p->next; printf(" %d , ,
",i); scanf("%d%s%f",&(p->num),&(p->name),&(p->score)); } p->next =NULL; } void print_LinkList(struct st* Head ) // , { struct st* p; p=Head; while (p) { printf(" :%d, :%s, :%f
",p->num,p->name,p->score); p = p->next; } } // ,p ,p1 2 , 2: p->next->next , // 2 struct st * del_list (struct st **source,struct st* target) { struct st *p1,*p2,*p,*temp; //p1 ,p p1 , int tag; p1 = *source; p = p1; while (p1) { p2 = target; tag = 0; // while (p2) { if (p1->num == p2->num) // { if (p1 == *source) { *source = p1->next; free(p1); p1 = *source; p = p1; tag = 1; } else { p->next = p1->next; temp = p1; p1 = temp->next; free(temp); tag = 1; // , p , p1 break; } } p2 = p2->next; } if (tag == 0) // , p p1 { p = p1; //p p1 p1 = p1->next; } } } struct st* inverted_list(struct st*head) // { struct st *first,*p1,*p2,*p3; if (head==NULL) return head; else { first=head; // p1=head; p2=p1->next; while (p2) { p3=p2->next; //p3 p2 , p2 p2->next=p1; // p1 p2 p1=p2; // p1,p2,p3 , p2=p3; } head=p1; first->next=NULL; return head; } }