1. 程式人生 > >建立和遍歷單向線性連結串列(C)

建立和遍歷單向線性連結串列(C)

連結串列(Linked List)是由節點組成的(node)。而節點實質上是一個數據結構(struct or class)。連結串列和陣列(Array)的區別在於連結串列中的節點在記憶體中的位置不一定是連續的,並且節點個數無需在編譯時確定。

節點包含兩種資訊,一種是資料(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);
}