久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3521|回復: 2
打印 上一主題 下一主題
收起左側

C語言創建鏈表的技巧

[復制鏈接]
跳轉到指定樓層
樓主
ID:390214 發表于 2018-8-26 20:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   一直以來我都希望我的數據結構能達到一個比較高的水平:就像套用公式一樣的把各種數據結構寫出來。由于算法是基于數據結構的,所以如果要想把算法搞好,那數據結構功底一定要扎實。

    我的目標:很熟悉各種數據結構,把算法問題當作簡單的搭積木問題。(下面注意看注釋)

    今天復習了一下鏈表。
一、單鏈表
    typedef struct student
    {
        struct student *next;      //由于C語言是從上到下一行一行進行編譯,所以這里不能是stu *next;
        char *name;
    }stud;
   
    stud *Creat( int n )          //創建一個返回是結構體類型的指針,這里的n是創建的節點個數,由用戶決定
    {
        int i;
        stud *h, *p, *t;          //三個指針是此方法創建鏈表的必要條件,一個頭指針,另外兩個輪流交換地址(指針指向)
        h = ( stud * )malloc( sizeof( stu ) );
        h -> next = NULL;         //初始化      
        h -> name[0] = '\0';      //把數組的第一個空間取'\0'時,后面的空間都是'\0'
        
        t = h;                    //交換地址開始
        for( i = 0;i < n;i++ )
        {
            p = ( stud * )malloc( sizeof( stu ) );
            t -> next = p;
            p -> next = NULL;     //中間就是一個輪流交換的過程,把各種指針指向正確的位置就行了
                                  //技巧就是就是只寫每產生一個新結點時候的操作
            printf("請輸入學生姓名:");
            scanf("%s",p -> name );
            t = p;               //讓t指向新結點,可以理解成“又一波循環的開始”,每次把其他指針搞定之后一定要這步操作
        }
        p -> next = NULL;         //如果是循環單鏈表的話這里改成 p ->next = h;
        return h;                 //返回頭指針
    }   
   
二、雙向鏈表
        typedef struct student
        {
                struct student *prior, *next;  //比單鏈表多了一個prior指針而已,下面的操作十分類似
                char name[10];
        }stud;

        stud *Creat( int n )
        {
              int i;
              stud *h, *p, *t;            //三個指針是此方法創建鏈表的必要條件,一個頭指針,另外兩個輪流交換地址
        h = ( stud * )malloc( sizeof( stu ) );
        h -> next = NULL;          //初始化   
        h -> prior = NULL;         
        h -> name[0] = '\0';      

              t = h;
              for( i = 0;i < n;i++ )
        {
            p = ( stud * )malloc( sizeof( stu ) );
            p -> next = NULL;
            p -> prior = t;        //這里面的操作其實很簡單,就是只寫每產生一個新結點時候的操作,主要就是指針操作嘛
            t -> next = p;
            printf("請輸入學生姓名:");
            scanf("%s",p -> name );
            t = p;                 //最后別忘了把 t指向新結點
        }
            t -> next = NULL;       //有些書上加了這步,但我覺得沒有必要,得好好思考一下



               return h;
        }

三、鏈表里面的查找

        stud *search( stud *h, char *Name )//對于不是很長的鏈表,完全可以從頭結點開始查找。查找的依據是姓名  
        {
            stud *t;                                       //因為要順著結點的next走下去,需要一個變量t和next輪流交換

            t = h->next;
            while( p )
            {
                    if( strcmp( t -> name,Name) == 0 )
            {                        //說明找到了
                            return t;
                      }
                      else
                            t = t->next;                     //指向下一結點的通用方法
             }
              printf("NOT FIND !\n");
        }






最后,感覺結點的刪除沒啥好分析的,就不作記錄了。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390214 發表于 2018-8-26 20:32 | 只看該作者
for循環里面,技巧就是只寫每產生一個新結點時候的操作
回復

使用道具 舉報

板凳
ID:348836 發表于 2019-8-5 13:12 | 只看該作者
鏈表 學習是個長期的過程,利用單片機可以通過梯形圖編程 編譯器的制作來提升技能
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久久 | 波多野结衣电影一区 | 日韩欧美国产电影 | 蜜臀av日日欢夜夜爽一区 | 久www| 中文字幕日韩一区 | 在线观看av网站永久 | 欧美久久久久久久久中文字幕 | 国产污视频在线 | 97免费视频在线观看 | 欧美日韩精品在线免费观看 | 亚洲1区| 人妖videosex高潮另类 | 中文字幕 亚洲一区 | 免费的色网站 | 国产不卡视频在线 | 欧美一级电影免费 | 午夜小电影 | 国产区在线 | 欧美日韩精品久久久免费观看 | 色视频www在线播放国产人成 | 国产乱码久久久久久一区二区 | 久久蜜桃av一区二区天堂 | 国产精品s色| h视频在线看 | 精产国产伦理一二三区 | 欧美精品在线一区二区三区 | 天堂在线免费视频 | 美女高潮网站 | av一级久久 | 日韩精品一区二区三区视频播放 | 蜜桃视频麻豆 | 天天干天天草 | 亚洲二区精品 | 欧美激情va永久在线播放 | 国产精品亚洲精品日韩已方 | 国产精品毛片久久久久久 | 日韩h | 成人午夜视频在线观看 | 日日噜噜噜夜夜爽爽狠狠视频, | 日韩欧美在线一区二区 |