总结一下几点:
数据结构不能只听老师讲,不能只刷题,要实操,没有实操,你的理论终归是纸上谈兵。
你可以背不下来课本上冗杂的专属名词,但是你不能不会写代码。
有空的时候就自己敲一敲代码,不要让自己写代码的手生了。
带头结点的链队实现:
编译器:dev c++(因为好多算法比赛都是用这个编译器,所以我也改掉了使用其他编译器的习惯。)
语言:c
//带头结点的链队 #include#include //链队 typedef struct Queue { int data; struct Queue * next; }Queue; typedef struct LinkQueue { Queue* front; //队头指针 Queue* rear; //队尾指针 }LinkQueue; //初始化链队 LinkQueue* InitQueue() { LinkQueue* queue = (LinkQueue*)malloc(sizeof(LinkQueue)); if(queue) { queue->front = queue->rear = (Queue*)malloc(sizeof(Queue));//头结点 queue->rear->next = NULL; printf("初始化成功!n"); return queue; } else { printf("初始化失败!n"); return NULL; } } //入队 int EnQueue(LinkQueue* queue, int data) { Queue* q = (Queue*)malloc(sizeof(Queue)); if (q) { q->data = data; q->next = NULL; queue->rear->next = q; queue->rear = q; printf("入队成功!n"); return 1; } else { printf("入队失败!n"); return 0; } } //出队 int DeQueue(LinkQueue* queue) { if (queue->front != queue->rear) { Queue* q = queue->front->next; queue->front->next = q->next; if (queue->rear == q) { queue->rear = queue->front;//改变尾指针的地址 } free(q); printf("出队成功!n"); return 1; } else { printf("出队失败!n"); return 0; } } //销毁队列 void DestroyQueue(LinkQueue* queue) { while(queue->front) { queue->rear = queue->front->next; free(queue->front);//第一个销毁的是头结点 queue->front = queue->rear; } //最后头指针和尾指针都置空而不是指向头结点 printf("队列已经销毁!n"); } //清空队列 void ClearQueue(LinkQueue* queue) { while(queue->front != queue->rear) { Queue* q = queue->front->next; queue->front->next = q->next; if(queue->rear == q) { queue->rear = queue->front; } free(q); } printf("队列已经清空!n"); } //队列的遍历(从队尾开始) void ThroughQueue(LinkQueue* queue) { Queue* q = queue->front->next; while(q) { printf("%dt", q->data); q = q->next; } printf("n-------------------------n"); } int main() { int chose, judge; LinkQueue* queue; while(1) { fflush(stdin); printf("带头结点的链队操作:n1.初始化链队n2.入队n3.出队n4.清空队列n5.销毁队列n6.遍历队列n"); scanf("%d", &chose); switch(chose) { case 1://初始化链队 queue = InitQueue(); break; case 2://入队 printf("请输入你要输入的数据:"); int data; scanf("%d", &data); judge = EnQueue(queue, data); break; case 3://出队 judge = DeQueue(queue); break; case 4://清空队列 ClearQueue(queue); break; case 5://销毁队列 DestroyQueue(queue); break; case 6://遍历队列 ThroughQueue(queue); break; default: printf("请输入正确的数字!n"); break; } } return 0; }
效果图:



