靜態鏈表和動態鏈表的區別

靜態鏈表和動態鏈表是線性錶鏈式結構的兩張不同的表現方式。

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

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

一:所謂靜態鏈表,是所有的節點都是在程序中定義好的,不是臨時開闢的,也不能用完後釋放。

具體代碼參考如下:

#include <stdio.h>
 
/* 靜態鏈表 */
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
 
    //遍歷靜態鏈表
    p = head;			//使p指針也指向第1個結點
    
    do{
        printf("%d\n", p->num);	//輸出p所指向結點的數據
        p = p->next;		//然後讓p指向下一個結點
    } while (p != NULL);	//直到p的next成員爲NULL,即完成遍歷
 
    return 0;
}

二:動態鏈表是指在程序執行過程中,從無到有的建立起一個鏈表,即一個一個的開闢節點和輸入各節點數據,並建立起前後聯繫。

具體參考代碼如下:

#include <stdio.h>
#include <stdlib.h>
 
/*所謂動態鏈表,是指在程序執行過程中從無到有地建立起一個鏈表,即一個一個地開闢結點和輸入各結點數據,並建立起前後相鏈的關係。*/
struct Student
{
    int No;		//學號
    struct Student *next;
};
 
int main()
{
    struct Student *p1, *p2;
	struct Student *head, *p;
 
    int n = 0; //結點個數
 
    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
 
    //遍歷動態鏈表
	p = head;
    printf("\n學號爲:\n");
 
    while (p != NULL)
    {
        printf("%d\n", p->No);
        p = p->next;
    }
 
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章