結構體的應用:
//數據結構與算法
? ? ? ? ? ? ?數據結構 ---- 指的是 數據的組織形式 ?
數組 --- 數據結構
? ? ? ? ? ? ?數組特點
? ? ? ? ? ? ?連續性,有序性,單一性
數據操作(訪問)時的特點
--------------------------------------------------------------
數組:
? ? 數據結構體---操作時候的特點, ? ? //特點決定他應用的場合
?? ? ? ? ? ? ? ? 優勢, s[i] 隨機訪問(隨機存取)---> 存 拿數據很方便
?? ??? ??? ??? ? 不足: 插入數據 刪除數據 不方便
鏈表
? ?? ?鏈式數據結構;
struct stu s1;
struct stu s2;
struct stu s3;
?
? ? ?s1->s2->s3?? ?
? 特點:
? ? 優勢:增加和刪除數據 很方便 ?
?? ?不足:存和取數據的時候不方便,沒有數組方便
?? ?
[數據]
[指針]?? ?
?? ? ?
節點
struct Node
{
? ? int data; ? ?//數據域 --存儲要處理的數據
? ? struct Node*next; ?//保存地址--指向下一個節點
}; ? ? ? ? //節點類型?? ? ?
struct Node n1;
struct Node n2;
struct Node n3;?
鏈式存儲的樣子:
[數據n1] ? ? ? ?[數據n2] ? ? ?[數據n3]?
[指針&n2]?? ??? ?[指針&n3]?? ? ?[指針 xxx ] ?
? n1 ? ? ? ? ? ? n2 ? ? ? ? ? ?n3?
?? ? ?
----------------------------------
有頭鏈表和無頭鏈表
無頭--第一個節點數據與為隨機值或者無效值
有頭--第一個節點不存有效數據 ? ? //作用:為了更方便的操作鏈表
C語言中 ---> 主要研究 ?“有頭單項鏈表“
頭節點 ---數據域值隨機
首節點 ---第一個保存有效數據的節點
尾節點 ---鏈表的最后一個有效節點 NULL。
操作: //數據結構體 數據的處理 --> 增刪改查
1、創建一個鏈表
? ? //空鏈表 -- 只有頭節點 ,但沒有有效的數據節點
?? ?struct Node *createEmptyLinklist(struct Node **head)
{
?? ?//struct Node *head = malloc(sizeof(struct Node));
?? ?*head = malloc(sizeof(struct Node));
?? ?(*head)->next = NULL;
?? ?return *head;
}
?? ?
頭加
void pushFront(struct Node *head,int dt)
{
?? ?struct Node *new = malloc(sizeof(struct Node ));
?? ?new->data = dt;
?? ?
?? ?//s2?
?? ?new->next = head->next;
?? ?//s3?
?? ?head->next = new;
}
?尾加
?void pushBack(struct Node *head,int dt)
{
?? ?//s1?
?? ?struct Node *new = malloc(sizeof(struct Node));
?? ?new->data = dt;
? ? //s2
?? ?struct Node *p = head;
?? ?while (p->next!=NULL)
?? ?{
?? ??? ?p = p->next;
?? ?}
?? ?//s3?
?? ?p->next = new;
?? ?new->next = NULL;
}
?
?
?
?
頭刪
void popFront(struct Node *head)
{
? ??
? ? struct Node *p = head->next;
?? ?head->next = p->next;
?? ?free(p);
}
?尾刪
?? ?void pushBack(struct Node *head,int dt)
{
?? ?//s1?
?? ?struct Node *new = malloc(sizeof(struct Node));
?? ?new->data = dt;
? ? //s2
?? ?struct Node *p = head;
?? ?while (p->next!=NULL)
?? ?{
?? ??? ?p = p->next;
?? ?}
?? ?//s3?
?? ?p->next = new;
?? ?new->next = NULL;
}
??
?? ? ?
銷毀鏈表:
?? ? ?void destroyLinklist(struct Node **head)
{
?? ?while (isEmpty(*head) == 0)
?? ?{
?? ??? ?popFront(*head);
?? ?}
??
?? ?free(*head);
?? ?*head=NULL;?
}
計算鏈表長度:
int length(struct Node *head)
{?
?? ?struct Node *p = head->next;?
?? ?int cnt = 0;
?? ?while (p != NULL)
?? ?{
?? ??? ?cnt++;
?? ??? ?p = p->next;
?? ?}
?? ?return cnt;
}
??
輸出鏈表數據:
void printLinklist(struct Node *head)
{
?? ?struct Node *p = head->next; //
?? ?while ( p!= NULL)
?? ?{
?? ??? ?printf("%d\n",p->data);
?? ??? ?p = p->next;
?? ?}
}
?? ? ?
?? ? ?