C語言學習 18-10-24
阿新 • • 發佈:2018-12-06
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;
}