亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言如何建立動態(tài)鏈表問題

 更新時間:2022年12月23日 11:09:47   作者:馬馬也  
這篇文章主要介紹了C語言如何建立動態(tài)鏈表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

C語言建立動態(tài)鏈表

所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結點和輸入各結點數(shù)據(jù),并建立起前后相鏈的關系。

代碼如下:

#include <stdio.h>
#include <stdib.h。
#define LEN sizeof(struct Student)
 
struct Student{
       long num;
       float score;
       struct Student * next;
};
 
int n;
 
struct Student * creat(void){
       struct Student * head;
       struct Student * p1, *p2;
       n = 0;
       p1 = p2 = (struct Student *)malloc(LEN);
       scanf("%ld,%f",&p1->num,&p1->score);
       head = null;
       while(p1->num != 0){
             n = n+1;
             if(n == 1)
                head = p1;
             else
                p2->next = p1;
             p2 = p1;
             p1 = (struct Student *)malloc(LEN);
             scanf("%ld,%f,&p1->num,&p1->score);
       }
       p2->next = null;
       return (head);
}

靜態(tài)鏈表和動態(tài)鏈表的區(qū)別

靜態(tài)鏈表和動態(tài)鏈表是線性表鏈式存儲結構的兩種不同的表示方式。

1、靜態(tài)鏈表是用類似于數(shù)組方法實現(xiàn)的,是順序的存儲結構,在物理地址上是連續(xù)的,而且需要預先分配地址空間大小。所以靜態(tài)鏈表的初始長度一般是固定的,在做插入和刪除操作時不需要移動元素,僅需修改指針。

2、動態(tài)鏈表是用內存申請函數(shù)(malloc/new)動態(tài)申請內存的,所以在鏈表的長度上沒有限制。動態(tài)鏈表因為是動態(tài)申請內存的,所以每個節(jié)點的物理地址不連續(xù),要通過指針來順序訪問。

一、靜態(tài)鏈表

結構體中的成員可以是各種類型的指針變量,當一個結構體中有一個或多個成員的基類型是本結構體類型時,則稱這種結構體為“引用自身的結構體”。如:

struct node
{
  char ch;
    int num;
  struct node *p;
};
 
struct node a;	//聲明一個結構體變量

p是一個可以指向struct node類型變量的指針成員。因此,a.p = &a 是合法的表達式,由此構成的存儲結構如下圖所示:

參考程序如下所示:

/*****************************************************
Copyright (C) 2017-2018 All rights reserved.
File name    : static_link.c
Version      : v1.0       
Author       : Zhengqijun
Date         : 2017年10月10日 星期二 15時12分30秒
Description  : 
Funcion List : 
*****************************************************/
 
#include <stdio.h>
 
/* 靜態(tài)鏈表 */
struct node
{
    int num;
    struct node *next;
};
 
int main()
{
    struct node stu[3];
    struct node *head, *p;
 
    stu[0].num = 10;		//對結點的num成員賦值
    stu[1].num = 20;
    stu[2].num = 30;
 
    head = &stu[0];		//頭指針指向第1個結點stu[0]
    stu[0].next = &stu[1];	//將結點stu[1]的地址賦值給stu[0]結點的next成員
    stu[1].next = &stu[2];	//將結點stu[2]的地址賦值給stu[1]結點的next成員
    stu[2].next = NULL;		//stu[2]是最后一個結點,其next成員不存放任何結點的地址,置為NULL
 
    //遍歷靜態(tài)鏈表
    p = head;			//使p指針也指向第1個結點
    
    do{
        printf("%d\n", p->num);	//輸出p所指向結點的數(shù)據(jù)
        p = p->next;		//然后讓p指向下一個結點
    } while (p != NULL);	//直到p的next成員為NULL,即完成遍歷
 
    return 0;
}

輸出結果為:

root@ubuntu:~/2017/1010$ ./static_link 
10
20
30

二、動態(tài)鏈表

到目前為止,凡是遇到處理“批量”數(shù)據(jù)時,我們都是利用數(shù)組來存儲。定義數(shù)組必須(顯式的或隱含的)指明元素的個數(shù),從而也就限定了一個數(shù)組中存放的數(shù)據(jù)量。在實際應用中,一個程序在每次運行時要處理的數(shù)據(jù)的數(shù)目通常并不確定。如果數(shù)組定義的小了,就沒有足夠的空間存放數(shù)據(jù),定義大了又浪費存儲空間。

對于這種情況,如果能在程序執(zhí)行過程中,根據(jù)需要隨時開辟存儲空間,不需要時再隨時釋放,就能比較合理的使用存儲空間。C 語言的動態(tài)存儲分配提供了這種可能性。每次動態(tài)分配的存儲單元,其地址不一定是連續(xù)的,而所需處理的批量數(shù)據(jù)往往是一個整體,各數(shù)據(jù)之間存在著接序關系。鏈表的每個節(jié)點中,除了要有存放數(shù)據(jù)本身的數(shù)據(jù)域外,至少還需要有一個指針域,用它來存放下一個節(jié)點元素的地址,以便通過這些指針把各節(jié)點連接起來。由于鏈表每個存儲單元都由動態(tài)存儲分配獲得,故稱這樣的鏈表為“動態(tài)鏈表”。

參考程序如下所示:

/*****************************************************
Copyright (C) 2017-2018 All rights reserved.
File name    : dynamic_link.c
Version      : v1.0       
Author       : Zhengqijun
Date         : 2017年10月10日 星期二 15時31分59秒
Description  : 
Funcion List : 
*****************************************************/
 
#include <stdio.h>
#include <stdlib.h>
 
/*所謂動態(tài)鏈表,是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結點和輸入各結點數(shù)據(jù),并建立起前后相鏈的關系。*/
struct Student
{
    int No;		//學號
    struct Student *next;
};
 
int main()
{
    struct Student *p1, *p2;
	struct Student *head, *p;
 
    int n = 0; //結點個數(shù)
 
    head = NULL;
    p1 = (struct Student *)malloc(sizeof(struct Student));
    printf("請輸入第1個學號\n");
    scanf("%d", &p1->No);
 
    p2 = p1; //開始時,p1和p2均指向第1個結點
    while (p1->No != 0)
    {
        n++;
        if (n == 1)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
 
        p2 = p1;//p2是最后一個結點
        printf("請輸入學號,輸入0終止:\n");
        p1 = (struct Student *)malloc(sizeof(struct Student));
        scanf("%d", &p1->No);
    };
 
    p2->next = NULL;//輸入完畢后,p2->next為NULL
 
    //遍歷動態(tài)鏈表
	p = head;
    printf("\n學號為:\n");
 
    while (p != NULL)
    {
        printf("%d\n", p->No);
        p = p->next;
    }
 
    return 0;
}

輸出結果為:

root@ubuntu:~/2017/1010$ ./dynamic_link 
請輸入第1個學號1請輸入學號,輸入0終止:2請輸入學號,輸入0終止:3請輸入學號,輸入0終止:4請輸入學號,輸入0終止:0學號為:1234

注意:動態(tài)鏈表中,每個節(jié)點沒有自己的名字,只能靠指針維系節(jié)點之間的關系。一旦某個節(jié)點的指針“斷開”,后續(xù)節(jié)點就再也無法找尋!

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • string與char*轉換的使用詳解

    string與char*轉換的使用詳解

    本篇文章對string與char*的轉換進行的介紹。需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)LeetCode(10.正則表達式匹配)

    C++實現(xiàn)LeetCode(10.正則表達式匹配)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(10.正則表達式匹配),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 有關C++中隨機函數(shù)rand() 和srand() 的用法詳解

    有關C++中隨機函數(shù)rand() 和srand() 的用法詳解

    下面小編就為大家?guī)硪黄嘘PC++中隨機函數(shù)rand() 和srand() 的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解C++中常量的類型與定義

    詳解C++中常量的類型與定義

    這篇文章主要介紹了詳解C++中常量的類型與定義,使用#define與const來定義常量是C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-05-05
  • 基于VC編寫COM連接點事件的分析介紹

    基于VC編寫COM連接點事件的分析介紹

    本篇文章是對VC編寫COM連接點事件進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++詳細講解圖的拓撲排序

    C++詳細講解圖的拓撲排序

    拓撲排序(Topological?Sorting)若一個由圖中所有點構成的序列?A?滿足:對于圖中的每條邊?(x,y),x?在?A?中都出現(xiàn)在?y?之前,則稱?A?是該圖的一個拓撲序列
    2022-05-05
  • C++實現(xiàn)raw_input的方法

    C++實現(xiàn)raw_input的方法

    這篇文章主要介紹了C++實現(xiàn)raw_input的方法,通過C++來實現(xiàn)Python中發(fā)raw_input的方法,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C/C++詳解實現(xiàn)二層轉發(fā)

    C/C++詳解實現(xiàn)二層轉發(fā)

    數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡進行通信的節(jié)點,第二層數(shù)據(jù)包不能從一個網(wǎng)絡傳輸?shù)搅硪粋€網(wǎng)絡。而二層轉發(fā)是根據(jù)報文的目的MAC直接進行轉發(fā),轉發(fā)過程中不用對報文的頭部做任何的修改
    2022-05-05
  • C++中高性能內存池的實現(xiàn)詳解

    C++中高性能內存池的實現(xiàn)詳解

    在 C/C++ 中,內存管理是一個非常棘手的問題,我們在編寫一個程序的時候幾乎不可避免的要遇到內存的分配邏輯。本文將通過C++實現(xiàn)高性能內存池,感興趣的可以了解一下
    2022-10-10
  • C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解

    C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解

    這篇文章主要介紹了C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08

最新評論