建立和遍歷單向線性連結串列(C)
阿新 • • 發佈:2019-02-03
連結串列(Linked List)是由節點組成的(node)。而節點實質上是一個數據結構(struct or class)。連結串列和陣列(Array)的區別在於連結串列中的節點在記憶體中的位置不一定是連續的,並且節點個數無需在編譯時確定。
因為在C語言中定義一個struct變數必須加上struct關鍵字,為了簡潔起見,我們用node來替換:
我們聲明瞭一個stud結構型別,其中包含了編號,名字和年齡等資料,以及指標型別為自身的指標變數。
遍歷連結串列:
main函式:
節點包含兩種資訊,一種是資料(data),一種是指向另一個節點的指標。(指標實質上儲存的是節點的物理位置)
考慮一個單向線性連結串列(節點只有一個指標,並且最後一個節點指標內容為NULL)下面定義一個簡單的節點:
struct stud {
/* 資料 */
int roll;
char name[25];
int age;
/* 指標 */
struct stud *next;
};
因為在C語言中定義一個struct變數必須加上struct關鍵字,為了簡潔起見,我們用node來替換:
typedef struct stud node;
我們聲明瞭一個stud結構型別,其中包含了編號,名字和年齡等資料,以及指標型別為自身的指標變數。
定義一個建立連結串列的函式create_list()
node *create_list() { int k, n; /* n代表節點個數,k為計數器 */ node *p, *head; /* head指向頭部節點, p為臨時指標變數 */ /* 接受使用者輸入 */ printf ("\n How many elements to enter?"); scanf ("%d", &n); for (k=0; k<n; k++) { /* 第一次迴圈建立頭部節點 */ if (k == 0) { head = (node *) malloc(sizeof(node)); p = head; /* 臨時指標變數當前指向第一個節點 */ } /* 其它迴圈依次建立下一個節點,並移動臨時指標*/ else { p->next = (node *) malloc(sizeof(node)); p = p->next; } scanf ("%d %s %d", &p->roll, p->name, &p->age); /* 給每個節點資料賦值 */ } p->next = NULL; /* 因為是單向連結串列,所以最後一個節點的指標指向NULL(即0) */ return (head); /* 返回頭部指標 */ }
遍歷連結串列:
void display (node *head) /* 將連結串列頭部指標作為引數傳入 */ { int count = 1; /* 計數器 */ node *p; /* 臨時指標變數 */ p = head; /* 賦值,指向頭部節點 */ /* 迴圈遍歷節點,直到最後一個節點 */ while (p != NULL) { printf ("\nNode %d: %d %s %d", count,p->roll, p->name, p->age); count++; p = p->next; /* 記住移動指標 */ } printf ("\n"); }
main函式:
main()
{
node * head;
head = create_list();
display(head);
}
Over...
完整程式碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct stud node;
struct stud {
/* 資料 */
int roll;
char name[25];
int age;
/* 指標 */
struct stud *next;
};
node *create_list()
{
int k, n; /* n代表節點個數,k為計數器 */
node *p, *head; /* head指向頭部節點, p為臨時指標變數 */
/* 接受使用者輸入 */
printf ("\n How many elements to enter?");
scanf ("%d", &n);
for (k=0; k<n; k++)
{
/* 第一次迴圈建立頭部節點 */
if (k == 0)
{
head = (node *) malloc(sizeof(node));
p = head; /* 臨時指標變數當前指向第一個節點 */
}
/* 其它迴圈依次建立下一個節點,並移動臨時指標*/
else
{
p->next = (node *) malloc(sizeof(node));
p = p->next;
}
scanf ("%d %s %d", &p->roll, p->name, &p->age); /* 給每個節點資料賦值 */
}
p->next = NULL; /* 因為是單向連結串列,所以最後一個節點的指標指向NULL(即0) */
return (head); /* 返回頭部指標 */
}
void display (node *head) /* 將連結串列頭部指標作為引數傳入 */
{
int count = 1; /* 計數器 */
node *p; /* 臨時指標變數 */
p = head; /* 賦值,指向頭部節點 */
/* 迴圈遍歷節點,直到最後一個節點 */
while (p != NULL)
{
printf ("\nNode %d: %d %s %d", count,p->roll, p->name, p->age);
count++;
p = p->next; /* 記住移動指標 */
}
printf ("\n");
}
main()
{
node * head;
head = create_list();
display(head);
}