1. 程式人生 > >C語言學習 18-10-24

C語言學習 18-10-24

1.連結串列

連結串列可以按照鏈式儲存多個結構體型別的資料,在C語言中使用要指向的結構體型別的指標來指向下一個節點(類似於python中單鏈表使用class Node裡的node.next屬性)。
使用一個記錄個人資訊的結構體來進行連結串列的演示:

#include "stdio.h"

typedef struct NAMENOTE
{
	int id;
	char *name;
	char *tel_num;
	struct NAMENOTE *p_next;
}NameNote;

int main()
{
	NameNote c = {1, "C", "123456789"
, NULL}; NameNote python = {2, "python", "654654689", NULL}; NameNote java = {3, "Java", "165432789", NULL}; //將上述三個結構體物件連結為一個連結串列 c.p_next = &python; python.p_next = &java; printf("id:%-5d, name:%-10s, telephone number:%-11d", c.id, c.name, c.tel_num); printf("id:%-5d, name:%-10s, telephone number:%-11d"
, c.p_next->id, c.p_next->name, c.p_next->tel_num); printf("id:%-5d, name:%-10s, telephone number:%-11d", c.p_next->p_next->id, c.p_next->p_next->name, c.p_next->p_next->tel_num); return 0; }

2. 結構體內部宣告本結構體型別的指標

在一個結構體中宣告一個本結構體的指標不能用 typedef 起的別名,只能用 struct+結構體名* 來宣告。

typedef struct NAMENOTE
{
	int id;
	char *name;
	char *tel_num;
	struct NAMENOTE *p_next;         //在此處使用 NameNote *p_next 宣告指標是錯誤的,因為還沒有完成typedef的宣告
}NameNote;

3.連結串列的遍歷

遍歷連結串列首先需要找到一個連結串列的頭節點(或頭指標)。

#include <stdio.h>

typedef struct NAMENOTE
{
	int id;
	char *name;
	char *tel_num;
	struct NAMENOTE *p_next;
}NameNote;

int main()
{
	//1.宣告三個節點
	NameNote c = {1, "C", "111", NULL};
	NameNote python = {2, "python", "222", NULL};
	NameNote java = {3, "java", "333", NULL};
	NameNote *p_flag = &c;
	
	//2.將這三個節點進行連結
	c.p_next = &python;
	python.p_next = &java;
	
	//3.進行遍歷
	while(p_flag != NULL)
	{
		printf("id:%-5d, name:%-10s, telephone number:%-11s\n", p_flag->id, p_flag->name, p_flag->tel_num);
		p_flag = p_flag->p_next;
	}
	
	return 0;
}

4.手動新增連結串列

本次的手動新增連結串列的思想是先建立一個 struct 物件,再使用該物件進行連結。
注:本次不使用頭指標指向頭節點的方法

#include <stdio.h>

typedef struct NAMENOTE
{
	int id;
	char *name;
	char *tel_num;
	struct NAMENOTE *p_next;
}NameNote;

void AppendNode(NameNote *head_node, NameNote *append_node);

int main()
{
	//1.宣告三個節點
	NameNote c = {1, "C", "111", NULL};
	NameNote python = {2, "python", "222", NULL};
	NameNote java = {3, "java", "333", NULL};
	NameNote *p_flag = &c;
	
	
	
	return 0;
}

void AppendNode(NameNote *head_node, NameNote *append_node)
{
	while(head_node->p_next != NULL)
	{
		head_node = head_node->p_next;
	}
	head->p_next = append_node;
	
	return;
}