飛書文檔https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd
一、存儲結構
順序存儲
鏈式存儲
二、常用數據結構
2.1、棧
先進后出
場景:
后退/前進功能:網頁瀏覽器中的后退和前進按鈕可以使用棧來實現。在瀏覽網頁時,每次訪問一個新頁面時,當前頁面的信息將被推入棧中。當用戶點擊后退按鈕時,程序將從棧中彈出最近的訪問頁面,并顯示上一個頁面。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_STACK_SIZE 100typedef struct {char url[MAX_STACK_SIZE];
} StackItem;typedef struct {StackItem items[MAX_STACK_SIZE];int top;
} Stack;void initStack(Stack *stack) {stack->top = -1;
}int isStackEmpty(Stack *stack) {return stack->top == -1;
}int isStackFull(Stack *stack) {return stack->top == MAX_STACK_SIZE - 1;
}void push(Stack *stack, char *url) {if (isStackFull(stack)) {printf("Stack overflow!\n");return;}stack->top++;strcpy(stack->items[stack->top].url, url);
}char* pop(Stack *stack) {if (isStackEmpty(stack)) {printf("Stack underflow!\n");return NULL;}char *url = stack->items[stack->top].url;stack->top--;return url;
}int main() {char inputurl[MAX_STACK_SIZE];int choice;Stack stack;initStack(&stack);while (1){printf("------》1:入棧\n");printf("------》2:出棧\n");scanf("%d",&choice);switch (choice){case 1:printf("請輸入入棧內容:");scanf("%s",inputurl);push(&stack,inputurl);printf("入棧成功\n");break;case 2:if (!isStackEmpty(&stack)) {char *url = pop(&stack);printf("出棧:%s\n", url);}else{printf("已沒有數據\n");}break;default:printf("無效操作\n");break;}}return 0;
}
2.2、隊列
場景:
編寫代碼,實現演唱會購票用戶(id、座位區域(A、B、C))購票與出票。
分析:
按購票順序先后處理,先購票先出票
#include <stdio.h>#define MAX_AREA_SIZE 10
#define MAX_QUEUE_SIZE 5typedef struct {int id;char area[MAX_AREA_SIZE];
} User;typedef struct {User data[MAX_QUEUE_SIZE];int front; //隊列頭位置int rear;? //隊列尾位置
} Queue;/*** @brief 初始化隊列* 初始化時,由于隊列為空,隊列頭和尾位置都在0* @param q*/
void initQueue(Queue *q) {q->front = q->rear = 0;
}/*** @brief 判斷隊列是否為空* 當隊列頭位置和尾位置相同時,隊列為空* @param q* @return int*/
int isQueueEmpty(Queue *q) {return q->front == q->rear;
}/*** @brief 判斷隊列是否滿* 當隊列尾位置+1等于隊列頭位置時,隊列滿(隊列尾位置追上頭位置)* @param q* @return int*/
int isQueueFull(Queue *q) {return (q->rear + 1) % MAX_QUEUE_SIZE == q->front;
}/*** @brief 入隊* 先判斷隊列是否滿,然后存儲數據到隊列尾位置,隊列尾位置+1* @param q* @param s* @return int*/
int enqueue(Queue *q, User *s) {if (isQueueFull(q)) {return 0;}printf("id=%d, area=%s ", s->id, s->area);q->data[q->rear] = *s;q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;return 1;
}
/*** @brief 出隊* 先判斷隊列是否空,然后讀取隊列頭的數據,隊列頭位置+1* @param q* @param s* @return int*/
int dequeue(Queue *q, User *s) {if (isQueueEmpty(q)) {return 0;}*s = q->data[q->front];printf("id=%d, area=%s\n", s->id, s->area);q->front = (q->front + 1) % MAX_QUEUE_SIZE;return 1;
}int main() {int id = 0;User user;int choice;Queue q;initQueue(&q);while (1){printf("------》1:顧客購票\n");printf("------》2:工作人員出票\n");scanf("%d",&choice);switch (choice){case 1:printf("請輸入購票區域:");user.id = id ++;scanf("%s",user.area);if(enqueue(&q, &user) == 1)printf("支付成功,等待工作人員處理\n");elseprintf("支付失敗,當前無票\n");break;case 2:printf("出票:");User s;if (!dequeue(&q, &s)) {printf("已沒有購票需要處理\n");}break;default:printf("無效操作\n");break;}}return 0;
}
2.3、鏈表
場景:實現一個用戶信息管理系統,支持插入、查找、刪除
分析:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定義用戶結構體
typedef struct User {char name[50];int age;struct User *next;
} User;// 初始化鏈表頭節點
User *head = NULL;// 插入用戶信息
void insertUser() {User *newUser = (User *) malloc(sizeof(User));printf("請輸入用戶名:");scanf("%s", newUser->name);printf("請輸入年齡:");scanf("%d", &newUser->age);newUser->next = NULL;if (head == NULL) {head = newUser;} else {User *temp = head;while (temp->next != NULL) {temp = temp->next;}temp->next = newUser;}printf("用戶信息插入成功!\n");
}// 刪除用戶信息
void deleteUser() {if (head == NULL) {printf("鏈表為空,無法刪除用戶信息!\n");return;}char name[50];printf("請輸入要刪除的用戶名:");scanf("%s", name);User *temp = head;User *prev = NULL;while (temp != NULL && strcmp(temp->name, name) != 0) {prev = temp;temp = temp->next;}if (temp == NULL) {printf("未找到要刪除的用戶信息!\n");return;}if (prev == NULL) {head = temp->next;} else {prev->next = temp->next;}free(temp);printf("用戶信息刪除成功!\n");
}// 查找用戶信息
void findUser() {if (head == NULL) {printf("鏈表為空,無法查找用戶信息!\n");return;}char name[50];printf("請輸入要查找的用戶名:");scanf("%s", name);User *temp = head;while (temp != NULL && strcmp(temp->name, name) != 0) {temp = temp->next;}if (temp == NULL) {printf("未找到要查找的用戶信息!\n");} else {printf("用戶名:%s,年齡:%d\n", temp->name, temp->age);}
}int main() {int choice;while (1) {printf("請選擇要執行的操作:\n");printf("1. 插入用戶信息\n");printf("2. 刪除用戶信息\n");printf("3. 查找用戶信息\n");printf("4. 退出程序\n");printf("請輸入操作編號:");scanf("%d", &choice);switch (choice) {case 1:insertUser();break;case 2:deleteUser();break;case 3:findUser();break;case 4:exit(0);default:printf("輸入的操作編號有誤,請重新輸入!\n");break;}}return 0;
}