1. 程式人生 > >動態連結串列和靜態連結串列的區別

動態連結串列和靜態連結串列的區別

靜態連結串列是用陣列實現的,是順序的儲存結構,在實體地址上是連續的,而且需要預先分配大小。動態連結串列是用申請記憶體函式(C是malloc,C++是new)動態申請記憶體的,所以在連結串列的長度上沒有限制。動態連結串列因為是動態申請記憶體的,所以每個節點的實體地址不連續,要通過指標來順序訪問。

*所有結點都是在程式中定義的,不是臨時開闢的,也不能用完後釋放,這種連結串列稱為“靜態連結串列”。*/
struct Student
{
    int num;
    float score;
    struct Student *next;
};
int main()
{
    struct Student stu1, stu2, stu3, *head, *p;
    stu1.num
= 1001; stu1.score = 80; //對結點stu1的num和score成員賦值 stu2.num = 1002; stu2.score = 85; //對結點stu2的num和score成員賦值 stu3.num = 1003; stu3.score = 90; //對結點stu3的num和score成員賦值 head = &stu1; //頭指標指向第1個結點stu1 stu1.next = &stu2; //將結點stu2的地址賦值給stu1結點的next成員 stu2.next = &stu3; //將結點stu3的地址賦值給stu2結點的next成員
stu3.next = NULL; //stu3是最後一個結點,其next成員不存放任何結點的地址,置為NULL p = head; //使p指標也指向第1個結點 //遍歷靜態連結串列 do{ printf("%d,%f\n", p->num, p->score); //輸出p所指向結點的資料 p = p->next; //然後讓p指向下一個結點 } while (p != NULL); //直到p的next成員為NULL,即完成遍歷
system("p
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
*所謂動態連結串列,是指在程式執行過程中從無到有地建立起一個連結串列,即一個一個地開闢結點和輸入各結點資料,並建立起前後相鏈的關係。*/
struct Student
{
    int No;//學號
    struct Student *next;
};
int main()
{
    struct Student *p1, *p2, *head;
    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

    //遍歷動態連結串列
    struct Student *p;
    p = head;
    while (p != NULL)
    {
        printf("%d,", p->No);
        p = p -> next;
    }
    printf("\n");

    system("pause");
}