數(shù)據(jù)結(jié)構(gòu)結(jié)課作業(yè)日記

直到昨天中午,我還在因?yàn)樽x錯(cuò)題而瘋狂學(xué)習(xí)新知識(shí)。

把整個(gè)任務(wù)腦補(bǔ)成了一個(gè)巨大的任務(wù)的錯(cuò)誤太可怕了座舍,以后要記住這次的教訓(xùn),簡(jiǎn)直是白費(fèi)了一天多的功夫陨帆。

不過這兩天也不僅僅做這個(gè)任務(wù)曲秉,還復(fù)習(xí)了計(jì)算機(jī)網(wǎng)絡(luò),但是考試居然不是今天疲牵,是下周的今天承二。

這種事情怎么老是搞錯(cuò)呢。纲爸。亥鸠。

算了都是好事不在意它。

結(jié)課作業(yè)中的問題

長(zhǎng)久不用C語言缩焦,導(dǎo)致語言基礎(chǔ)爆炸读虏,很多東西忘記怎么使用,頻頻報(bào)錯(cuò)袁滥。

寫兩篇日志盖桥,分別是C語言的語法方面的問題和C語言算法的問題,本篇是語法問題题翻。

指針和數(shù)組

這個(gè)問題一直是問題揩徊,在學(xué)C語言的時(shí)候草草就過去了,沒有細(xì)致探討嵌赠,這里進(jìn)行一定的實(shí)用性探討塑荒。

  1. 數(shù)組名是數(shù)組首元素地址
    數(shù)組名和指針一樣,存儲(chǔ)的是地址姜挺,特殊在數(shù)組名內(nèi)存儲(chǔ)的是數(shù)組本身首元素的地址齿税。
    一個(gè)詞叫做解引用,把一個(gè)地址對(duì)應(yīng)的數(shù)據(jù)取出就是解引用炊豪。
    對(duì)于一個(gè)數(shù)組a[N]凌箕,我們進(jìn)行了三步:第一步,取出數(shù)組元素首地址词渤;第二步牵舱,目標(biāo)地址=首地址+sizeof(type)*N,得到目標(biāo)a[N]的地址缺虐;第三步芜壁,對(duì)地址解引用。
    對(duì)于一個(gè)指針p高氮,只有兩步慧妄,對(duì)p的地址解引用,獲取到p的值纫溃,也就是p指向目標(biāo)的地址腰涧;再對(duì)這個(gè)目標(biāo)地址再次解引用,獲得目標(biāo)元素紊浩。

數(shù)組名窖铡!=數(shù)組指針,而是等于數(shù)組首元素指針坊谁。


  1. 一維數(shù)組可以和一維指針混用费彼,二維數(shù)組可以喝二維指針混用嗎?不可口芍!

首先我們強(qiáng)調(diào)箍铲,把多維數(shù)組當(dāng)做一維數(shù)組看待。
比如char arr[3][3],我們就要把它當(dāng)做一維數(shù)組鬓椭,內(nèi)里元素分別為arr[0]arr[1]arr[2],這三個(gè)char [3]型的數(shù)組颠猴。

為什么关划?
我們先來看二維數(shù)組名代表了什么在代碼中:

代碼1:
char buf[2][2]={{1,2},{3,4}};
char *p = buf;
編譯結(jié)果:

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]

代碼2:
char buf[2][2]={{1,2},{3,4}};
char (*p)[2] = buf;
編譯結(jié)果:
無警告信息

顯然,二位數(shù)組的數(shù)組名指針類型是char*[2]型翘瓮,我們應(yīng)當(dāng)把二維乃至多維數(shù)組看成嵌套型的一維數(shù)組贮折,也就是俄羅斯套娃數(shù)組,我們可以看到资盅,數(shù)組名指針指向的首元素指針既可以是普通變量调榄,也可以是一維或多維數(shù)組。

  1. 那么如何用指針來指向數(shù)組呢呵扛?
    數(shù)組中的元素排列是順序排列的每庆,也就是一橫排一橫排連續(xù),所以有以下代碼可以用指針指向數(shù)組并且調(diào)用今穿。
#include<stdio.h>
#include<stdlib.h>

#define ROW 2
#define COLUMN 2
int main(void)
{
    char buf[ROW][COLUMN]={{1,2},{3,4}};
char *p = (char*)buf;
//訪問buf[x][y],即訪問p[x*COLUMN+y]
printf("buf = %d,%d,%d,%d\r\n",p[COLUMN*0+0],p[COLUMN*0+1],p[COLUMN*1+0],p[COLUMN*1+1]);
system("pause");
return 0;
}

結(jié)果是這樣



通過這個(gè)試驗(yàn)缤灵,我們可以了解到如何用指針來管理數(shù)組了。

指針傳遞蓝晒、引用傳遞

函數(shù)中有各種參數(shù)凤价,普通的直接調(diào)用沒有什么可說的,僅僅是新建一個(gè)值拔创,只存活在函數(shù)調(diào)用期間利诺,而函數(shù)麻煩而又有用的地方就在這指針傳遞和引用傳遞。

  1. 二者有什么共同點(diǎn)剩燥?
    都是在函數(shù)中操作實(shí)參地址的慢逾,而值傳遞操作的不是實(shí)參地址。

  2. 有什么不同點(diǎn)灭红?
    引用的規(guī)則是被引用的同時(shí)必須被初始化侣滩,同時(shí)不能有NULL引用,引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)变擒。
    一旦引用倍初始化君珠,就不能改變引用的關(guān)系。
    而指針可以任何時(shí)候被初始化娇斑,可以是NULL策添,可以隨時(shí)改變所指的對(duì)象。

  3. 二者不同的根本原因毫缆。
    從概念上講唯竹。指針從本質(zhì)上講就是存放變量地址的一個(gè)變量,在邏輯上是獨(dú)立的苦丁,它可以被改變浸颓,包括其所指向的地址的改變和其指向的地址中所存放的數(shù)據(jù)的改變。

    而引用是一個(gè)別名,它在邏輯上不是獨(dú)立的产上,它的存在具有依附性棵磷,所以引用必須在一開始就被初始化,而且其引用的對(duì)象在其整個(gè)生命周期中是不能被改變的(自始至終只能依附于同一個(gè)變量)晋涣。

用一段這個(gè)函數(shù)泽本,展示下使用流程。

#include<stdio.h>
#include<stdlib.h>

#define ROW 2
#define COLUMN 2

typedef struct TEST
{
    int a;
    int b[5];
    int *c;
}testOf;

void tt(testOf *t);
void ttt(testOf &t);
int main(void)
{
    testOf testa,testb;
    testOf *te;
    testOf *teb=&testb;
    te=&testa;
    testa.a=8;
    for(int i=0;i<5;i++){
    tt(te);
    ttt(testa);
    ttt(testb);
    tt(teb);
    }
    teb=te;
    
    printf("%d%d\n",testa.a,testa.c);
    system("pause");

    return 0;
}
void tt(testOf *t)
{
    
    t->a++;
    printf("%d\n",t->a);

    t->c=&t->a;
}
void ttt(testOf &t)
{
    t.a=100;
    printf("%d\n",t.a);

}

函數(shù)多返回值

很多時(shí)候姻僧,我們都會(huì)碰到一個(gè)函數(shù)需要多個(gè)返回值,但是一個(gè)函數(shù)的返回值只有一個(gè)蒲牧,如何用一個(gè)函數(shù)返回多個(gè)值呢撇贺?

想到指針就對(duì)了,我們可以在參數(shù)中使用指針參數(shù)冰抢,傳遞我們主函數(shù)中的參數(shù)松嘶,通過這個(gè)函數(shù)來影響實(shí)參。

我很喜歡一句話就是“編程的本質(zhì)不就是改變量嗎挎扰?”先有量的輸入翠订,然后改變成很多量,變型遵倦、變數(shù)尽超、計(jì)算都是改變量。

輸入流

輸出的方法千篇一律梧躺,大多時(shí)候就是好看點(diǎn)和不好看的區(qū)別似谁。

每次寫c的時(shí)候,做題沒感覺掠哥,但是只要是寫整個(gè)程序就會(huì)出現(xiàn)各種難受的問題巩踏,最大的問題就是輸入的問題。

如何能夠方便輸入续搀、快速輸入經(jīng)常會(huì)成為一個(gè)大問題塞琼。

如何能夠快速輸入呢?
我們就想到一個(gè)方法禁舷,用空格隔開數(shù)組中的每一個(gè)數(shù)彪杉,用回車來確定。
這樣不僅能清晰看到我們的輸入牵咙,也比一直敲數(shù)字敲回車優(yōu)雅在讶。

粗略代碼如下

#include <stdio.h>
int main(){
    int num;
    int i=0;
    int arr[10];
   while(1){
        scanf("%d",&num);
        char c=getchar();
        arr[i++]=num;
        if(c=='\n'){
            break;
        }
   }
  return 0;
}

getchar();讀走了空格和回車并且在下面判定,空格再次循環(huán)霜大,回車退出构哺。

因?yàn)檫@次是為了給結(jié)課作業(yè)中的二維數(shù)組鄰接表做輸入,我就簡(jiǎn)單再寫一個(gè)給二維數(shù)組鄰接表賦值的詳細(xì)代碼。

#include<stdio.h>
#include<stdlib.h>

#define MAX_V_NUM 10
#define MAX_INT 999 //不可能數(shù)
//#define MAX_CITY_NUM 10

typedef struct TEST
{
    char chengshi[20] ;
    int arcsM[MAX_V_NUM][MAX_V_NUM];
    int Vnum,Lnum;
    int *c;
}testOf;

/*
typedef struct CITY
{
    testOf city[MAX_CITY_NUM];
}TheWord
*/

void init(testOf *map);//初始化鄰接表曙强,每個(gè)點(diǎn)到其他店為不可能值残拐,到自己為0;
void mapIn(testOf &map);//手動(dòng)輸入鄰接表碟嘴,按行輸入溪食,空格分開數(shù),回車分開行娜扇。
void mapShow(testOf *map);//展示鄰接表



int main(void)
{
    testOf map,arcs;
    testOf *pmap;
    testOf *parcs;
    pmap=&map;
    parcs=&arcs;

    init(pmap);
    mapShow(pmap);
    mapIn(map);
    mapShow(pmap);

    system("pause");
    return 0;
}

/*初始化鄰接表错沃,*/
void init(testOf *map)
{
    int i,j;
    map->Vnum=MAX_V_NUM;
    for(i=0;i<MAX_V_NUM;i++)    //鄰接矩陣的初始化
    {
        for(j=0;j<MAX_V_NUM;j++)
        {
            if(i==j)
            {
                map->arcsM[i][j]=0;
            }
            else
            {
                map->arcsM[i][j]=MAX_INT;
            }
        }
    }
}

/*手動(dòng)輸入鄰接表*/
void mapIn(testOf &map)
{
    int num;
    int i=0;
    int j=0;
    int Vtime;
    printf("請(qǐng)輸入城市中重要站點(diǎn)的數(shù)目\n");
    scanf("%d",&map.Vnum);
    Vtime=map.Vnum;
    getchar();

    printf("請(qǐng)輸入鄰接表值,格式為1 2 3 4雀瓢,將這4個(gè)數(shù)賦值給鄰接矩陣第一排\n");

/*為鄰接表手動(dòng)賦值枢析,0代表不改變*/
    for(i=0;i<map.Vnum;i++) 
    {   
        printf("現(xiàn)在是第%d行,共有%d行\(zhòng)n",i+1,map.Vnum);
        for(j=0;j<map.Vnum;j++)
        {
            scanf("%d",&num);
            char c=getchar();

            if(num!=0 && map.arcsM[i][j]!=0)
            {
                map.arcsM[i][j]=num;
            }
            /*
            if(c==' '){
                Vtime--;
                if(Vtime==1){
                    break;
                }
            }
            */
            if(c=='\n'){
                break;
            }
        }
    }
}

/*展示鄰接表*/
void mapShow(testOf *map)
{
    printf("--------此表如下----------\n");
    int i,j;
        for(i=0;i<map->Vnum;i++)    
    {   

        for(j=0;j<map->Vnum;j++)
        {
            printf("%d ",map->arcsM[i][j]);
        }
        printf("\n");
    }
}

這段代碼實(shí)現(xiàn)了通過空格隔開數(shù)據(jù)刃麸,分行輸入數(shù)據(jù)到數(shù)組中醒叁,效果如下

雖然沒有魯棒性,沒有錯(cuò)誤顯示泊业,不過有了一個(gè)大的架子把沼,試驗(yàn)中使用還是足夠的。

本次實(shí)驗(yàn)期間任務(wù)繁多吁伺,如果在最后較為空閑饮睬,會(huì)補(bǔ)出等同這段代碼,會(huì)更加美觀更加健壯篮奄。


以下是我遇到問題后续捂,上網(wǎng)查資料幫助到我的文章。

————————————————
版權(quán)聲明:本文為CSDN博主「千淘萬漉」的原創(chuàng)文章宦搬,遵循CC 4.0 BY-SA版權(quán)協(xié)議牙瓢,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/matrix_google/article/details/76595439
————————————————
版權(quán)聲明:本文為CSDN博主「魏波-」的原創(chuàng)文章间校,遵循CC 4.0 BY-SA版權(quán)協(xié)議矾克,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weibo1230123/article/details/75541862

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末憔足,一起剝皮案震驚了整個(gè)濱河市胁附,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滓彰,老刑警劉巖控妻,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異揭绑,居然都是意外死亡弓候,警方通過查閱死者的電腦和手機(jī)郎哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菇存,“玉大人夸研,你說我怎么就攤上這事∫琅福” “怎么了亥至?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贱迟。 經(jīng)常有香客問我姐扮,道長(zhǎng),這世上最難降的妖魔是什么衣吠? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任茶敏,我火速辦了婚禮,結(jié)果婚禮上蒸播,老公的妹妹穿的比我還像新娘。我一直安慰自己萍肆,他們只是感情好袍榆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塘揣,像睡著了一般包雀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亲铡,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天才写,我揣著相機(jī)與錄音,去河邊找鬼奖蔓。 笑死赞草,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吆鹤。 我是一名探鬼主播厨疙,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疑务!你這毒婦竟也來了沾凄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤知允,失蹤者是張志新(化名)和其女友劉穎撒蟀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温鸽,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡保屯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配椭。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虫溜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出股缸,到底是詐尸還是另有隱情衡楞,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布敦姻,位于F島的核電站瘾境,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镰惦。R本人自食惡果不足惜迷守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旺入。 院中可真熱鬧兑凿,春花似錦、人聲如沸茵瘾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗秘。三九已至圣絮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雕旨,已是汗流浹背扮匠。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡涩,地道東北人棒搜。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像活箕,于是被迫代替她去往敵國(guó)和親帮非。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361