
数据结构
牛哥之零的起点
ITman
展开
-
二分查找实现(Jon Bentley:90%程序员无法正确实现)
引言 Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码。也许很多人都早已听说过这句话,但我还是想引用《编程珠玑》上的如下几段文字: “二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复转载 2014-12-03 10:42:25 · 728 阅读 · 0 评论 -
柔性数组(flexible array)
相信好多人都没听过这个概念——柔性数组(flexible array)到底原创 2014-11-20 17:32:08 · 726 阅读 · 0 评论 -
链表知识点(十三)【判断两个链表是否相等】
typedef struct lnode { int data; struct lnode *next; }Lnode,*PLnode; //带头结点 int List_Equal(PLnode Head1,PLnode Head2) { PLnode p1; PLnode p2; if(Head1原创 2014-11-11 16:57:57 · 2566 阅读 · 0 评论 -
链表知识点(十二)【逆序打印单链表】
方法1:不改变链表结构的情况下: ① .首先对整个链表进行正向遍历,利用一个临时数组来存储遍历的结点,然后从后边开始输出。 int print_list(Link * Head)//不带头结点 { Link * p; int i = 0; int a[100]; p = Head; while(p) {原创 2014-11-11 16:55:54 · 574 阅读 · 0 评论 -
链表知识点(十一)【合并链表之后仍然有序】
方法1:递归实现: Node * MergeList(Node *Head1,Node *Head2) { if(Head1 == NULL) { return Head2; } if(Head2 == NULL) { return Head1;原创 2014-11-11 16:54:01 · 473 阅读 · 0 评论 -
链表知识点(十)【删除带有头结点的单链表的第一个结点(包含数据的第一个节点)】
void RemoveHead(PNode Head) { PNode p; p = Head->next; Head->next = p->next;//Head=p->next;写成这样就会把头的地址变了,所以不要写成这样 free(p); }原创 2014-11-11 16:52:08 · 1742 阅读 · 0 评论 -
链表知识点(九)【判断单链表是否有环】
bool Is_Circiual_List(struct node * s) { struct node * fast; struct node * slow; fast= slow = s; if(fast == NULL || fast->next == NULL) { r原创 2014-11-11 16:50:18 · 464 阅读 · 0 评论 -
链表知识点(八)【单链表的输出中间值】
//求链表中间的结点,不知道结点N的值,要求只遍历一次可以求出中间结点 Link * search_mid(Link * Head) { Link *p1; Link *p2; p1 = Head; p2 = Head->next->next; while(p2) {原创 2014-11-11 16:46:28 · 606 阅读 · 0 评论 -
求二叉树高度
#define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0;转载 2014-10-23 20:48:30 · 491 阅读 · 0 评论 -
关于二叉树的宽度,高度,相等
关于二叉树的宽度,高度,相等面试题 |字号 订阅 经常会遇到关于二叉树的算法问题,虽然比较简单,不过我觉得还是有必要总结一下.顺便写了个sample程序,以供参考.本文中主要讨论关于二叉树的以下3个问题,都是用递归来实现,Divide and conquer也就是所谓的分冶策略. 1.二叉树的高度 2.二叉树的宽度 3.比较两个二叉树是否相等转载 2014-10-23 20:25:01 · 520 阅读 · 0 评论 -
链表知识点(七)【单链表的逆置】
Link * Reverse_link(Link * Head) { Link * p1; Link * p2; Link * p3; p1 = Head; p2 = p1->next; if(Head == NULL || Head->next == NULL) { return Head; } while(p2 != NULL) { p3 = p2->next;//创原创 2014-10-19 22:15:56 · 483 阅读 · 0 评论 -
链表知识点(六)【单链表的输出】
int print_list(Link * Head) { Link * p; int i = 1; p = Head; while(p) { printf("链表中第%d结点值为:%d\n",i,p->data); i++; p = p->next; } return 0; }原创 2014-10-19 22:12:40 · 777 阅读 · 0 评论 -
链表知识点(五)【单链表的测长)】
int Calculate_Length(Link * Head) { Link * p; int length = 0; p = Head; while(p) { length++; p = p->next; } return length; }原创 2014-10-19 22:10:42 · 395 阅读 · 0 评论 -
链表知识点(四)【单链表排序(冒泡排序)】
Link* Sort_link(Link * Head) { Link *p; int n; int temp; int i; int j; p = Head; n = Calculate_Length(Head); if(Head== NULL || He原创 2014-10-18 09:30:44 · 679 阅读 · 0 评论 -
链表知识点(三)【单链表的删除操作】
删除操作:p->next =p->next->next; Link* Delete_element_link(Link * Head,int Val) { Link * p1; Link * p2; p1 = Head; while(p1->data!= Val && p1->next != NULL) {原创 2014-10-18 09:23:57 · 663 阅读 · 0 评论 -
链表知识点(二)【单链表的插入操作】
【原理讲解】在p之后要插入一个结点s,首先最开始p->next 为Q,对于单链表的插入,首先建后链,后建前链。建后链的过程中,p->next始终未Q。原创 2014-10-18 09:20:45 · 1724 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,转载 2014-10-16 13:44:26 · 470 阅读 · 0 评论 -
链表知识点(一)【单链表的创建操作】
【单链表的创建操作】 typedef struct lnode { int data; structlnode *next; }Lnode,*PLnode; typedef int datatype; typedef struct link { int data; struct link* next; }Li原创 2014-10-16 13:28:59 · 605 阅读 · 0 评论