計(jì)算機(jī) - 話(huà)題

數(shù)據(jù)結(jié)構(gòu)入門(mén)-零C基礎(chǔ)者適用(ZZ)
查看(1425) 回復(fù)(1)
lyh2006
  • 積分:1982
  • 注冊(cè)于:2010-08-01
發(fā)表于 2010-08-13 23:09
樓主
很多朋友抱怨說(shuō)嚴(yán)蔚敏的書(shū)很難,復(fù)習(xí)效果不理想。我現(xiàn)在一面在講大家要耐心,要多查多問(wèn),而轉(zhuǎn)過(guò)頭來(lái)看到那些符號(hào),想起自己當(dāng)初C語(yǔ)言60分的成績(jī),初學(xué)數(shù)據(jù)結(jié)構(gòu)的茫然,一步一步爬過(guò)來(lái)的辛苦,于是有了寫(xiě)個(gè)數(shù)據(jù)結(jié)構(gòu)入門(mén)的想法,但愿對(duì)剛剛?cè)腴T(mén)C語(yǔ)言基礎(chǔ)不好和大跨考的朋友們有所幫助,數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)已經(jīng)進(jìn)入正常軌道的朋友可以飄過(guò)。
我重新審視嚴(yán)書(shū),概念與文字描述的內(nèi)容都是易懂的,而算法與程序往往是卡住我們的地方。我試著解釋每個(gè)符號(hào)的含義,C語(yǔ)言的基礎(chǔ)知識(shí)點(diǎn),圖論中的難點(diǎn),等等。但應(yīng)該很少會(huì)涉及概念性的知識(shí)點(diǎn)。

本節(jié)主要講了結(jié)構(gòu)體定義的N種不同寫(xiě)法,類(lèi)型定義符typdef的用法,引用機(jī)制。

P9頁(yè)例1-6

在C語(yǔ)言中,最簡(jiǎn)單的結(jié)構(gòu)體是這樣的:
復(fù)制內(nèi)容到剪貼板
代碼:
struct ADT
{
    int x,y;
};
其中ADT是結(jié)構(gòu)的名稱(chēng),x和y是結(jié)構(gòu)體的數(shù)據(jù)成員,注意{}后面的分號(hào),這個(gè)是不能忘掉的。
現(xiàn)在添加一個(gè)成員函數(shù)(這實(shí)際上是C++的內(nèi)容),即數(shù)據(jù)結(jié)構(gòu)中所謂的基本操作,如下:
復(fù)制內(nèi)容到剪貼板
代碼:
struct ADT
{
    int x,y;
    void x_dayu_y()
    {
        if(x>y)
            printf("x>y
");
        else
            printf("x<=y
");
    };
};
關(guān)于函數(shù)和if..else…語(yǔ)句的知識(shí)請(qǐng)參閱C語(yǔ)言課本,這個(gè)不用解釋的吧。下面給出完整的程序,來(lái)描述這個(gè)結(jié)構(gòu)是如何被使用的。當(dāng)我說(shuō)到“完整的程序”的時(shí)候,你完全可以在VC++6.0上來(lái)運(yùn)行它。
復(fù)制內(nèi)容到剪貼板
代碼:
#include<stdio.h>

struct ADT
{
    int x,y;
    void x_dayu_y()
    {
        if(x>y)
            printf("x>y
");
        else
            printf("x<=y
");
    };
};

int main()
{
    int a;
    a=1;
    ADT adt; // 定義一個(gè)結(jié)構(gòu)體變量,請(qǐng)區(qū)別:結(jié)構(gòu)體變量adt的類(lèi)型是結(jié)構(gòu)體ADT
    adt.x=1; // 賦值
    adt.y=2;
    adt.x_dayu_y(); // 基本操作
    return 0;
}
結(jié)構(gòu)體的知識(shí)暫時(shí)介紹這些,對(duì)于理解例1-6的結(jié)構(gòu)已經(jīng)夠用了。
在此強(qiáng)調(diào)一點(diǎn),嚴(yán)書(shū)上的程序都是偽代碼描述,完全COPY到程序里是肯定不能執(zhí)行的。
復(fù)制內(nèi)容到剪貼板
代碼:
ADT Triplet
{
    InitTriplet(&T,v1,v2,v3)
    ……
}ADT Triplet
ADT Triplet可以理解為結(jié)構(gòu)體名稱(chēng),ADT即為書(shū)中前文提到的Abstract Data Type,而Triplet即為三元組,函數(shù)InitTriplet(&T,v1,v2,v3),此外偽代碼并未指明返回值,需要解釋一下的是符號(hào)&的含義,&在C++中表示引用,完整的程序如下:
復(fù)制內(nèi)容到剪貼板
代碼:
#include<stdio.h>

void f(int &a,int b)
{
    a=100;
    b=100;
}

int main()
{
    int a=1,b=1;
    f(a,b);
    printf("%d %d
",a,b);
    return 0;
}

lyh2006
  • 積分:1982
  • 注冊(cè)于:2010-08-01
發(fā)表于 2010-08-13 23:10
沙發(fā)
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語(yǔ)言中,&是地址符,C中的地址與指針的傳遞過(guò)程過(guò)于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。
實(shí)際上這個(gè)例題很簡(jiǎn)單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識(shí)點(diǎn),如果還有需要解釋的地方,請(qǐng)告訴我!

P10頁(yè)(1)—(11)
(1)
復(fù)制內(nèi)容到剪貼板
代碼:
#define TRUE 1
命令define的詳細(xì)作用請(qǐng)參閱C語(yǔ)言課本,此處只作簡(jiǎn)單說(shuō)明:
#define TRUE 1的效果是,在預(yù)編譯的時(shí)候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺(tái)程序中TRUE不被支持,而在windows編程中TRUE與true等同。)

類(lèi)型定義符typedef,詳細(xì)請(qǐng)參閱C語(yǔ)言課本。
復(fù)制內(nèi)容到剪貼板
代碼:
typedef int Status;
定義一個(gè)變量時(shí),Status a;與int a;的效果是相同的,類(lèi)型定義符typedef只是為了使用上的方便,在windows編程中你會(huì)見(jiàn)到大量的類(lèi)型定義。

下面請(qǐng)注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書(shū)中經(jīng)常會(huì)見(jiàn)到的結(jié)構(gòu)體定義方法。

如下面這個(gè)使用了類(lèi)型定義符的結(jié)構(gòu)體定義:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
}Point,*lPoint;
其核心實(shí)際上就是前面已經(jīng)講過(guò)的
復(fù)制內(nèi)容到剪貼板
代碼:
struct node
{
    int x,y;
};
只不過(guò)把名稱(chēng)ADT換成了node。
這里typedef的作用:
將類(lèi)型struct node{}重定義為Point;
將類(lèi)型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint
注意此處Point與lPoint的名稱(chēng)不能相同,前者是結(jié)構(gòu)體名稱(chēng),后者是結(jié)構(gòu)體指針名稱(chēng)。
在此處,可以省略struct后面的結(jié)構(gòu)體名稱(chēng)node,寫(xiě)成如下形式:
復(fù)制內(nèi)容到剪貼板
代碼:
struct
{
    int x,y;
};
下面是完整的程序,來(lái)描述結(jié)構(gòu)體是如何被使用的。
復(fù)制內(nèi)容到剪貼板
代碼:
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int x,y;
}Point,*lPoint;

int main()
{
    Point a;
    a.x=1; // e使用結(jié)構(gòu)體變量時(shí)用的是“.”
    a.y=1;
    lPoint b; // 定義結(jié)構(gòu)體指針
    b=(lPoint)malloc(sizeof(Point)); // 要給指針?lè)峙鋬?nèi)存
    b->x=1; // 使用指針時(shí)用的是“->”
    b->y=1;
    Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫(xiě)法不一樣而已
    c=(Point*)malloc(sizeof(Point));
    c->x=1;
    c->y=1;
    return 0;
}
書(shū)中還會(huì)看到:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
    struct node* next;
}Point,*lPoint;
這里的node不能省略,其余不再做過(guò)多的解釋。有關(guān)指針與內(nèi)存分配的知識(shí)點(diǎn),將在以后章節(jié)中講到。

嚴(yán)書(shū)從(2)到(11)是把C語(yǔ)言的知識(shí)簡(jiǎn)單帶過(guò)

lyh2006
  • 積分:1982
  • 注冊(cè)于:2010-08-01
發(fā)表于 2010-08-13 23:10
3樓
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語(yǔ)言中,&是地址符,C中的地址與指針的傳遞過(guò)程過(guò)于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。
實(shí)際上這個(gè)例題很簡(jiǎn)單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識(shí)點(diǎn),如果還有需要解釋的地方,請(qǐng)告訴我!

P10頁(yè)(1)—(11)
(1)
復(fù)制內(nèi)容到剪貼板
代碼:
#define TRUE 1
命令define的詳細(xì)作用請(qǐng)參閱C語(yǔ)言課本,此處只作簡(jiǎn)單說(shuō)明:
#define TRUE 1的效果是,在預(yù)編譯的時(shí)候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺(tái)程序中TRUE不被支持,而在windows編程中TRUE與true等同。)

類(lèi)型定義符typedef,詳細(xì)請(qǐng)參閱C語(yǔ)言課本。
復(fù)制內(nèi)容到剪貼板
代碼:
typedef int Status;
定義一個(gè)變量時(shí),Status a;與int a;的效果是相同的,類(lèi)型定義符typedef只是為了使用上的方便,在windows編程中你會(huì)見(jiàn)到大量的類(lèi)型定義。

下面請(qǐng)注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書(shū)中經(jīng)常會(huì)見(jiàn)到的結(jié)構(gòu)體定義方法。

如下面這個(gè)使用了類(lèi)型定義符的結(jié)構(gòu)體定義:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
}Point,*lPoint;
其核心實(shí)際上就是前面已經(jīng)講過(guò)的
復(fù)制內(nèi)容到剪貼板
代碼:
struct node
{
    int x,y;
};
只不過(guò)把名稱(chēng)ADT換成了node。
這里typedef的作用:
將類(lèi)型struct node{}重定義為Point;
將類(lèi)型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint
注意此處Point與lPoint的名稱(chēng)不能相同,前者是結(jié)構(gòu)體名稱(chēng),后者是結(jié)構(gòu)體指針名稱(chēng)。
在此處,可以省略struct后面的結(jié)構(gòu)體名稱(chēng)node,寫(xiě)成如下形式:
復(fù)制內(nèi)容到剪貼板
代碼:
struct
{
    int x,y;
};
下面是完整的程序,來(lái)描述結(jié)構(gòu)體是如何被使用的。
復(fù)制內(nèi)容到剪貼板
代碼:
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int x,y;
}Point,*lPoint;

int main()
{
    Point a;
    a.x=1; // e使用結(jié)構(gòu)體變量時(shí)用的是“.”
    a.y=1;
    lPoint b; // 定義結(jié)構(gòu)體指針
    b=(lPoint)malloc(sizeof(Point)); // 要給指針?lè)峙鋬?nèi)存
    b->x=1; // 使用指針時(shí)用的是“->”
    b->y=1;
    Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫(xiě)法不一樣而已
    c=(Point*)malloc(sizeof(Point));
    c->x=1;
    c->y=1;
    return 0;
}
書(shū)中還會(huì)看到:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
    struct node* next;
}Point,*lPoint;
這里的node不能省略,其余不再做過(guò)多的解釋。有關(guān)指針與內(nèi)存分配的知識(shí)點(diǎn),將在以后章節(jié)中講到。

嚴(yán)書(shū)從(2)到(11)是把C語(yǔ)言的知識(shí)簡(jiǎn)單帶過(guò)

lyh2006
  • 積分:1982
  • 注冊(cè)于:2010-08-01
發(fā)表于 2010-08-13 23:10
4樓
實(shí)際上函數(shù)f執(zhí)行后,a=100,b=1,這就是引用符&的作用。實(shí)際上,在C語(yǔ)言中,&是地址符,C中的地址與指針的傳遞過(guò)程過(guò)于復(fù)雜,不作解釋以免添亂,而這也正是C++中引入引用機(jī)制的原因。
實(shí)際上這個(gè)例題很簡(jiǎn)單,選擇它只是為了引出結(jié)構(gòu)體和引用機(jī)制的知識(shí)點(diǎn),如果還有需要解釋的地方,請(qǐng)告訴我!

P10頁(yè)(1)—(11)
(1)
復(fù)制內(nèi)容到剪貼板
代碼:
#define TRUE 1
命令define的詳細(xì)作用請(qǐng)參閱C語(yǔ)言課本,此處只作簡(jiǎn)單說(shuō)明:
#define TRUE 1的效果是,在預(yù)編譯的時(shí)候,程序中所有的“TRUE”都被機(jī)械的替換為1,1代表真值。(在控制臺(tái)程序中TRUE不被支持,而在windows編程中TRUE與true等同。)

類(lèi)型定義符typedef,詳細(xì)請(qǐng)參閱C語(yǔ)言課本。
復(fù)制內(nèi)容到剪貼板
代碼:
typedef int Status;
定義一個(gè)變量時(shí),Status a;與int a;的效果是相同的,類(lèi)型定義符typedef只是為了使用上的方便,在windows編程中你會(huì)見(jiàn)到大量的類(lèi)型定義。

下面請(qǐng)注意了,講到數(shù)據(jù)結(jié)構(gòu)嚴(yán)書(shū)中經(jīng)常會(huì)見(jiàn)到的結(jié)構(gòu)體定義方法。

如下面這個(gè)使用了類(lèi)型定義符的結(jié)構(gòu)體定義:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
}Point,*lPoint;
其核心實(shí)際上就是前面已經(jīng)講過(guò)的
復(fù)制內(nèi)容到剪貼板
代碼:
struct node
{
    int x,y;
};
只不過(guò)把名稱(chēng)ADT換成了node。
這里typedef的作用:
將類(lèi)型struct node{}重定義為Point;
將類(lèi)型struct node {}*重定義為lPoint;(typedef struct node{}* lPoint
注意此處Point與lPoint的名稱(chēng)不能相同,前者是結(jié)構(gòu)體名稱(chēng),后者是結(jié)構(gòu)體指針名稱(chēng)。
在此處,可以省略struct后面的結(jié)構(gòu)體名稱(chēng)node,寫(xiě)成如下形式:
復(fù)制內(nèi)容到剪貼板
代碼:
struct
{
    int x,y;
};
下面是完整的程序,來(lái)描述結(jié)構(gòu)體是如何被使用的。
復(fù)制內(nèi)容到剪貼板
代碼:
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int x,y;
}Point,*lPoint;

int main()
{
    Point a;
    a.x=1; // e使用結(jié)構(gòu)體變量時(shí)用的是“.”
    a.y=1;
    lPoint b; // 定義結(jié)構(gòu)體指針
    b=(lPoint)malloc(sizeof(Point)); // 要給指針?lè)峙鋬?nèi)存
    b->x=1; // 使用指針時(shí)用的是“->”
    b->y=1;
    Point* c; // 與上面定義結(jié)構(gòu)體指針是一回事,寫(xiě)法不一樣而已
    c=(Point*)malloc(sizeof(Point));
    c->x=1;
    c->y=1;
    return 0;
}
書(shū)中還會(huì)看到:
復(fù)制內(nèi)容到剪貼板
代碼:
typedef struct node
{
    int x,y;
    struct node* next;
}Point,*lPoint;
這里的node不能省略,其余不再做過(guò)多的解釋。有關(guān)指針與內(nèi)存分配的知識(shí)點(diǎn),將在以后章節(jié)中講到。

嚴(yán)書(shū)從(2)到(11)是把C語(yǔ)言的知識(shí)簡(jiǎn)單帶過(guò)

回復(fù)話(huà)題
上傳/修改頭像

目前中國(guó)有20元紙幣嗎?

考研論壇提示:
1、請(qǐng)勿發(fā)布個(gè)人聯(lián)系方式或詢(xún)問(wèn)他人聯(lián)系方式,包括QQ和手機(jī)等。
2、未經(jīng)允許不得發(fā)布任何資料出售、招生中介等廣告信息。
3、如果發(fā)布了涉及以上內(nèi)容的話(huà)題或跟帖,您在考研網(wǎng)的注冊(cè)賬戶(hù)可能被禁用。

網(wǎng)站介紹 | 關(guān)于我們 | 聯(lián)系方式 | 廣告業(yè)務(wù) | 幫助信息
©1998-2015 ChinaKaoyan.com Network Studio. All Rights Reserved.

中國(guó)考研網(wǎng)-聯(lián)系地址:上海市郵政信箱088-014號(hào) 郵編:200092 Tel & Fax:021 - 5589 1949 滬ICP備12018245號(hào)