C語言鏈表練習

今天剛講完C語言的結構體,過幾天就要考試了,要復習一下,Java的學習應該要推遲幾天,老師布置了幾道關于鏈表的練習,自己親手碼的一百多行代碼,發上來記錄一下,其中的算法應該還可以進行優化,但由對于算法優化和深入學習,想等到下學期學數據結構時在進行,現在只求實現出來吧 (:з」∠)
題目: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.把一個鏈表按反序排序,即將原鏈頭當做鏈尾,原鏈尾當做鏈頭。
用函數inverted_list(struct st* head)實現;

注:其實del_list函數因為可能要對頭指針進行操作,所以應該傳入頭指針的地址才行,故形參應該為struct st ** source,是雙重指針,不知這里是不是老師題目給錯了

#include <stdio.h>
#include <stdlib.h>                     //用到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個結點的號碼,姓名,分數\n");
    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個結點的號碼,姓名,分數\n",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\n",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;
    }    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容