面試題—資料結構之單連結串列詳述(基本篇)

wqOoops發表於2011-07-24

單連結串列的結構是資料結構中最簡單的,它的每一個節點只有一個指向後一個節點的指標。

單連結串列節點的定義:

typedef struct node
{
	int data;    //節點內容
	node *next;  //下一個節點
}node;
單連結串列的建立:

//建立單連結串列
node *create()
{
	int i=0;			//連結串列中資料的個數
	node *head, *p, *q;
	int x = 0;
	head = (node *)malloc(sizeof(node));  //建立頭節點
	
	while(1)
	{
		printf("Please input the data: ");
		scanf("%d", &x);
		if(0 == x)				//data為0時建立結束
		{
			break;
		}
		p = (node *)malloc(sizeof(node));
		p->data = x;
		if(++i == 1)			//連結串列只有一個元素
		{
			head->next = p;		//連線到head的後面
		}
		else
		{
			q->next = p;		//連線到連結串列尾端
		}
		q = p;					//q指向末節點
	}
	q->next = NULL;				//連結串列的最後一個指標為NULL

	return head;
}
上面的程式碼中,while迴圈每次從終端讀入一個整型資料,並呼叫malloc動態分配連結串列節點記憶體儲存這個整型資料,然後在插入到單連結串列的末尾;最後當資料為0時表示插入資料結束,此時把末尾節點的next指標置為NULL。

單連結串列的測長:

//單連結串列的測長
int length(node *head)
{
	int len = 0;
	node *p = head->next;
	while(NULL != p)
	{
		len++;
		p = p->next;
	}

	return len;
}
單連結串列的列印:

//列印連結串列
void print(node *head)
{
	int pos = 0;
	node *p = NULL;
	if(NULL == head->next)
	{
		printf("Link is empty!\n");
		return ;
	}
	p = head->next;
	while(NULL != p)	//遍歷連結串列
	{
		printf("The %dth node is: %d\n", ++pos, p->data);
		p = p->next;
	}
}
單連結串列的查詢節點:

//單連結串列的節點查詢
//查詢pos位置的節點,返回節點指標
//pos從0開始,0返回head節點
node *search_node(node *head, int pos)
{
	node *p = head->next;
	if(pos < 0)				//pos位置不正確
	{
		printf("incorrect position to search node!\n");
		return NULL;
	}
	if(0 == pos)
	{
		return head;
	}
	if(NULL == p)
	{
		printf("Link is empty!\n");   //連結串列為空
		return NULL;
	}
	while(--pos)
	{
		if((p = p->next) == NULL)
		{
			printf("incorrect position to search node!\n");
			break;        //超出連結串列返回
		}
	}

	return p;
}
單連結串列的節點插入:

//單連結串列節點插入
//在單連結串列pos位置處插入節點,返回連結串列頭指標
//pos從0開始計算,0表示插入到head節點後面
node *insert_node(node *head, int pos, int data)
{
	node *item = (node *)malloc(sizeof(node));
	node *p = NULL;
	item->data = data;
	if(0 == pos)			//插入連結串列頭後面
	{
		head->next = item;  //head後面是item
		return head;
	}
	p = search_node(head, pos);   //獲得位置pos的節點指標
	if(NULL != p)
	{
		item->next = p->next;    //item指向原pos節點的後一個節點
		p->next = item;			 //把item插入到pos的後面
	}
	return head;
}
單連結串列的節點刪除:

//單連結串列節點刪除
//刪除單連結串列的pos位置的節點,返回連結串列頭指標
//pos從1開始計算,1表示刪除head後的第一個節點
node *delete_node(node *head, int pos)
{
	node *del;
	node *p = head->next;
	if(NULL == p)			//連結串列為空
	{
		printf("Link is empty!\n");
		return NULL;
	}
	p = search_node(head, pos-1);	//獲得位置pos的節點指標
	if(NULL != p && NULL != p->next)
	{
		del = p->next;
		p->next = del->next;
		delete del;
	}
	return head;
}
下面程式碼是上面各個函式的測試主程式:

int main()
{
	node *head = create();			//建立單連結串列
	printf("Length: %d\n", length(head)); //測量單連結串列長度
	head = insert_node(head, 2, 5);		//在第2個節點之後插入5
	printf("insert integer 5 after 2th node: \n");
	print(head);						//列印單連結串列
	head = delete_node(head, 2);		//刪除第2個節點
	printf("delete the 2th node: \n");	
	print(head);

	return 0;
}
下面是程式執行結果:

Please input the data: 1
Please input the data: 2
Please input the data: 3
Please input the data: 4
Please input the data: 0
Length: 4
insert integer 5 after 2th node:
The 1th node is: 1
The 2th node is: 2
The 3th node is: 5
The 4th node is: 3
The 5th node is: 4
delete the 2th node:
The 1th node is: 1
The 2th node is: 5
The 3th node is: 3
The 4th node is: 4
Press any key to continue





相關文章