電商專業學習嵌入式軟件開發第三十五天

  • C第九天

今天講的是在內存中開辟空間以及鏈表,老師說從今天開始我們就慢慢步入C高級階段了。今天講得覺得很難,老師寫的代碼能夠看懂,但是想自己寫就寫不出來了,老師的要求最好能模仿他的代碼然后自己寫出來,應該需要完全理解之后能夠寫出來吧。還發現經常用到指針,也需要把指針多看看。

內存:全局區+代碼區+堆區+棧區
全局區:全局變量,static修飾的變量,const修飾的變量,常量,的存儲區域
代碼區:普通代碼存放的區域
棧區(stack):局部變量存放的區域
堆區(heap):我們手動通過函數malloc()/calloc()/recalloc()/new()分配的內存所在區域。該區分配的空間的生命周期起始于malloc()等函數,終止于free()/delete(),空間被釋放

在堆上開辟空間:
函數:malloc()
頭文件:stdlib.h
函數功能:在堆上面開辟某字節長度的空間,成功,返回該內存的首地址,但是默認為void*型,所以要相應的進行類型強制轉換成所需要的數據類型。
malloc(100);
char a;
a='c'

例:
#include <stdio.h>
#include <stdlib.h>
void main()
{
    char *p=(char *)malloc(sizeof(char));
    *p='a';
    printf("%c\n",*p);
    free(p);//釋放指針p所對應的內存
}
//手動分配的區域,只能通過它返回的地址來找到它,所以該指針別搞丟了。

注:free(p) 釋放的只能是nalloc分配的空間。p指的是那塊空間的首地址。

#include <stdio.h>
#include <stdlib.h>
void main()
{
    int *p=(int *)malloc(sizeof(int));
    *p=100;
    printf("%d\n",*p);
    free(p);
//  p=NULL;//指針置空。
//  *p=200;
//  printf("%d\n",*p);  
}

注:系統所有的資源都是由操作系統負責調度和控制的,通過malloc分配一塊內存,系統會把這塊內存的使用權交出來,通過free釋放,則收回使用權,名義上這塊內存不能再私自訪問了,但是偷偷的用有時候也可以,但說不定什么時候就報錯了,所以對于一塊內存,malloc了就能用,free了就不能用了。

練習:手動分配一塊空間給學生,輸入并輸出學生的個人信息

#include <stdio.h>
#include <stdlib.h>
struct student
{
    int num;
    char *name;
    char sex;
    float score;
};
void main()
{
    struct student *p=(struct student *)malloc(sizeof(struct student));
/*  p->num=1;
    p->name="asdfg";
    p->sex='m';
    p->score=91;*/
    *p={1,"aaaaa",'m',91};
    printf("%d %s %c %.1f\n",p->num,p->name,p->sex,p->score);
}

問題:新建一塊內存區域,初步用來存放5個學生,后面陸續會增加學生和減少學生。

//節點的數據類型
struct student
{
    int data;//數據
    struct student *next;//指針,用來存放你下一個節點的地址。
};
//給節點開辟空間
  struct student *p=(struct student *)malloc(sizeof(struct student));
//定義一個結構體類型的時候,成員變量不能是本身結構體類型定義的變量,但可以是本身結構體類型定義的指針。

練習:新建一條含有n個節點的鏈表,n的值手動鍵盤輸入。

#include <stdio.h>
#include <stdlib.h>
//確定節點的數據類型
struct student
{
    //數據域
    int data;
    //指針域
    struct student *next;
};
//新建鏈表
struct student *Create()
{
    int n,i;
    printf("請輸入要創建的節點數:");
    scanf("%d",&n);getchar();
    struct student *head=(struct student *)malloc(sizeof(struct student));
    struct student *p=(struct student *)malloc(sizeof(struct student));
    printf("請輸入數據:");
    scanf("%d",&p->data);   getchar();
    head->next=p;//連接head和p節點
    for(i=1;i<n;i++)
    {
        struct student *q=(struct student *)malloc(sizeof(struct student));
        printf("請輸入數據:");
        scanf("%d",&q->data);   getchar();
        p->next=q;//連接p和q節點
        p=q;
    }
    p->next=NULL;//最后一個節點是p節點,它沒有下一個節點
    return head;
}
//打印鏈表
void Print(struct student *head)
{
    struct student *p=head->next;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}
//頭插
struct student *T_insert(struct student *head)
{
    struct student *q=(struct student *)malloc(sizeof(struct student));
    printf("請輸入數據(頭插):");
    scanf("%d",&q->data);getchar();
    q->next=head->next;
    head->next=q;
    return head;
}
//尾插
struct student *W_insert(struct student *head)
{
    struct student *q=(struct student *)malloc(sizeof(struct student));
    printf("請輸入數據(尾插):");
    scanf("%d",&q->data);getchar();
    struct student *p=head->next;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    p->next=q;
    q->next=NULL;
    return head;
}
//中插
struct student *Z_insert(struct student *head)
{
    int loc,i;
    printf("在第幾個節點后插入:");
    scanf("%d",&loc);
    struct student *q=(struct student *)malloc(sizeof(struct student));
    printf("請輸入數據:");
    scanf("%d",&q->data);getchar();
    struct student *p=head->next;
    for(i=1;i<loc;i++)
        p=p->next;
    q->next=p->next;
    p->next=q;
    return head;
}
//查:
//1.按節點位置查找
struct student *Find1(struct student *head)
{
    int n,i=1;  printf("查找第幾個節點:");
    scanf("%d",&n);getchar();
    struct student *p=head->next;
    while( p->next!=NULL && i<n)
    {       p=p->next;  i++;}
    if(i==n)        return p;
    else{printf("沒有找到!\n");return NULL;}
}
//2.按值查找:找到和你輸入的值相等的節點并返回該節點的地址
struct student *Find2(struct student *head)
{
    int data;printf("請輸入要找的值:");
    scanf("%d",&data);
    struct student *p=head->next;
    while(p->data!=data && p->next!=NULL)
    {p=p->next;}
    if(p->data==data) return p;
    else{printf("沒有找到!\n");return NULL;}
}
void main()
{
    struct student *head=Create();  Print(head);
    head=T_insert(head);    Print(head);
    head=W_insert(head);    Print(head);
    head=Z_insert(head);    Print(head);
    struct student *p;
    if(p=Find1(head))   printf("%d\n",p->data);
    if(p=Find2(head))   printf("%d\n",p->data);
}

在鏈表中插入的時候要先連后面的再連前面的,否則會出現錯誤。

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

推薦閱讀更多精彩內容