数据结构--C语言版
迷路的小绅士
无敌的我又迷路了
展开
-
头插法创建单链表
1.对单链表的解释 链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单列表要从空表开始,每读入一个数据元素则申请一个结点,然后插入在链表中。建立链表的过程就是一个不断插入结点的过程。插入结点的位置可以始终在链表的表头结点之后,也可以不断插在链表的尾部。 2.程序展示#include<stdi...原创 2018-04-17 16:59:23 · 2229 阅读 · 0 评论 -
单链表实现约瑟夫环
原理:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时把编号从0~n-1,最后结果+1即为原问题的解。(约瑟夫环 - 搜狗百科)代码:pNode JosephCircle(pList * ...原创 2018-09-17 19:46:15 · 361 阅读 · 0 评论 -
逆置/反转单链表
原理:首先保留头指针所指的第一个结点。然后从原链表中取出下一个结点插入到第一个结点前。 方法一:三个指针法void ReverseSList(pList* pplist)//三个指针法{ pNode pPre = NULL, pCur = NULL, pNext = NULL; assert(pplist); if (*pplist == NULL || (*pplist...原创 2018-09-17 19:57:48 · 212 阅读 · 0 评论 -
单链表排序(冒泡排序&快速排序)
void BubbleSord(pList plist){ pNode pCur = NULL; pNode pPre = NULL; pNode pTail = NULL;//pTail的指向是这个算法的关键 if (plist == NULL || plist->next == NULL)//排除空和一个结点的情况 { return; } while (plist ...原创 2018-09-23 16:13:44 · 3829 阅读 · 0 评论 -
合并两个有序链表,合并后依然有序
pNode MergeSList(pList plist1, pList plist2){ pNode pNewHead = NULL;//新链表 pNode pTail = NULL;//新链表的尾指针 pNode pL1 = plist1; pNode pL2 = plist2; if (plist1 == NULL || plist2 == NULL) { return ...原创 2018-09-23 16:17:23 · 288 阅读 · 0 评论 -
查找单链表的中间结点,要求只能遍历一次链表
pNode FindMiddleNode(pList plist){ /* 快慢指针,快的两步,慢的一步 */ pNode pFast = plist; pNode pSlow = plist; while (pFast&&pFast->next) { pFast = pFast->next->next; pSlow = pSlow-&g...原创 2018-09-23 21:26:49 · 278 阅读 · 0 评论 -
查找单链表的倒数第k个结点,要求只能遍历一次链表
pNode FindLastKNode(pList plist, int k){ pNode pFast = plist; pNode pSlow = plist; if (plist == NULL || k <= 0) { return NULL; } while (k--)//pFast先走k步 { if (pFast == NULL)//k大于链表中结点的个...原创 2018-09-23 21:27:40 · 377 阅读 · 0 评论 -
删除链表的倒数第k个结点
void DeleteLastKNode(pList plist, int k){ //1.找到倒数第k个结点 int count = 0; pNode pFast = plist; pNode pSlow = plist; pNode pPre = plist; if (plist == NULL || k <= 0) { return NULL; } while...原创 2018-09-23 21:28:54 · 267 阅读 · 0 评论 -
判断两个链表是否相交,若相交,求交点。(假设链表不带环)
判断是否相交不带环链表有三种情况,V,Y,L型,而这三种情况相交的共同点是两条链表的最后一个结点是相同的,这就解释了为什么以最后一个结点作为判断依据。int IsCrossWithoutCircle(pList plist1, pList plist2){ pNode pTail1 = plist1; pNode pTail2 = plist2; if (pTail1 == NU...原创 2018-09-23 21:31:48 · 196 阅读 · 0 评论 -
判断单链表是否带环?若带环,求环的长度,求环的入口点
判断是否带环,若带环返回相遇点,否则返回空(快慢指针法) pNode IsCircle(pList plist){ pNode pFast = plist; pNode pSlow = plist; while (pFast && pFast->next)//终止条件是为了保证快指针能够走两步 { pFast = pFast->next->ne...原创 2018-09-24 22:20:31 · 158 阅读 · 0 评论 -
迷宫的基本操作
Maze.h#pragma once#include<stdio.h>#include"Stack.h"#define MAX_ROW 6#define MAX_COL 6typedef struct position{ int x; int y;}position;typedef struct Maze{ int map[MAX_ROW][MAX_COL]...原创 2018-10-11 19:45:05 · 556 阅读 · 0 评论 -
判断两个链表是否相交,若相交,求交点。(链表可能带环)
int IsListCrossWithCircle(pList plist1, pList plist2){ pNode pMeetNode1 = NULL, pMeetNode2 = NULL; //杜绝空链表的存在 if (NULL == plist1 && NULL == plist2) { return 0; } //先各自判断两个链表是否带环(带环...原创 2018-10-09 22:05:27 · 197 阅读 · 0 评论 -
删除一个无头单链表的非尾结点(不能遍历链表)
思路:之前删除链表中某个位置的结点必须找到该节点的prev结点,并且需要遍历,而此题不能遍历,则之前的方法行不通。那么就想到了另一种方法——替换法。替换法:既然要删除该结点,那么我们可以将该结点的next结点的值赋给该结点,再删除这个next结点,这样就相当于删除了该结点。代码:void EraseNotTailNode(pNode pos){ pNo...原创 2018-09-12 17:11:19 · 302 阅读 · 0 评论 -
C语言实现单链表的基本操作
LinkList.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;assert.h&gt;#include&lt;str原创 2018-06-30 12:39:46 · 254 阅读 · 0 评论 -
C语言实现顺序表的基本操作
1.定义线性表的顺序存储是指在内存中用一组地址连续的存储单元依次存储线性表的各元素,用这种存储形式存储的线性表称为顺序表。也就是说,顺序表以数据元素在计算机内的物理位置相邻来表示数据元素在线性表中的逻辑相邻关系。2.线性表的顺序存储示意图...原创 2018-08-06 15:08:07 · 3142 阅读 · 0 评论 -
顺序栈的基本操作
Stack.h#pragma once#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<assert.h>#define STACK_INIT_SIZE 100//存储空间初始分配量#define STACKINCREMENT 10//存储空间分配增量...原创 2018-08-15 20:26:52 · 306 阅读 · 0 评论 -
链队列的基本操作
Queue.h#pragma once#include <stdio.h>#include <malloc.h>#include <assert.h>#define TRUE 1#define FALSE 0typedef int DataType;/*用链表表示的队列简称为链队列,为了操作方便,采用带头结点的链表结构,并设置一...原创 2018-08-15 20:43:02 · 12325 阅读 · 0 评论 -
实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间复杂度为O(1)
st入栈如果minst为空,则入栈minst;如果minst非空,或者minst的栈顶元素大于等于下一个入栈元素,minst也入栈该元素如果st与minst站定元素相等,则出栈minst;无论怎样,st每次都需要出栈MinStack.h#pragma once#include"Stack.h"typedef struct MinStack{ Stack st...原创 2018-08-17 17:55:31 · 301 阅读 · 0 评论 -
使用两个栈实现一个队列
s1入栈s1出栈后再如s2s2出栈QueueByTwoStack.h#pragma once#include "Queue.h"#include "Stack.h"// 两个栈实现一个队列typedef struct QueueByTwoStack{ Stack s1; Stack s2;}QueueByTwoStack;void Qu...原创 2018-08-17 18:10:02 · 89 阅读 · 0 评论 -
使用两个队列实现一个栈
StackByTwoQueue.h#pragma once#include "Queue.h"#include "Stack.h"// 两个队列实现一个栈typedef struct StackByTwoQueue{ Queue q1; Queue q2;}StackByTwoQueue;void StackByTwoQueueInit(StackB...原创 2018-08-21 15:01:08 · 117 阅读 · 0 评论 -
共享栈
1.静态共享栈2.奇偶共享栈SharedStack.h#pragma once#include"Stack.h"//静态共享栈#define MaxSize 100typedef struct SharedStack{ DataType data[MaxSize];/*数组长度*/ int top1;/*栈顶1*/ int top2;/*栈...原创 2018-08-21 15:21:28 · 805 阅读 · 0 评论 -
堆的基本操作
1.堆的概念如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<=K2*i+1 且 Ki<=K2*i+2,称为小堆Ki>=K2*i+1 且 Ki>=K2*i+2,称为大堆 (i=0,1,2…)本质上来说,堆就是一个满足上面两个条件的完全二叉树。2.性质如果i=...原创 2018-08-24 21:10:20 · 225 阅读 · 0 评论 -
带头结点的双向链表的基本操作
DList.h#pragma once#include&lt;malloc.h&gt;#include&lt;assert.h&gt;//带头结点的双向链表typedef int DateType;typedef struct DListNode{ struct DListNode* pNext; struct DListNode* pPre; DateType data;...原创 2018-10-10 22:17:41 · 386 阅读 · 0 评论