复习下C 链表操作(双向循环链表,查找循环节点)

双向循环链表  和 单向循环链表 查找循环节点 思路都是一样。 快慢指针查找法。 理论可参考

c 链表之 快慢指针 查找循环节点

typedef struct Student_Double
{
    char name[10];
    int  point;
    struct Student_Double *preStu;
    struct Student_Double *nextStu;
} StudentDouble;
StudentDouble *  CreateDoubleCircleLink_Table(){

    int i = 0;
    StudentDouble *head = NULL;
    head=(StudentDouble *)malloc(sizeof(StudentDouble));
    head->name[0]=‘\0‘;
    head->point = 0;
    head->nextStu = NULL;
    head->preStu = NULL;

    //循环节点
    StudentDouble *cirleStu = NULL;
    StudentDouble *temp = NULL;
    StudentDouble *currentNode = head;
    while (i<=9) {
        temp = (StudentDouble *)malloc(sizeof(StudentDouble));
        strncpy(temp->name,"Node",sizeof(temp->name));
        temp->point = i;
        temp->nextStu = NULL;
        temp->preStu = currentNode;

        currentNode->nextStu = temp;
        currentNode = temp;

        if (i==3) {
            cirleStu = currentNode;
        }
        i++;
    }
    //最后 合并循环节点
    currentNode->nextStu=cirleStu;
    return head;
}
//已知循环节点情况查询循环 链表,验证是否可用
void SelectDoubleLinkTable(StudentDouble *student){
    StudentDouble *next = student->nextStu;
    int i = 0;
    StudentDouble *circleStu = NULL;
    while (next) {
        if (circleStu!=NULL&&next->point == circleStu->point) {
            printf("循环节点%d,结束循环\n",next->point);
            break;
        }
        if (i==3) {
            circleStu = next;
        }
        printf("index %d; studentName is %s;  point is %d\n",i,next->name,next->point);
        i++;
        next = next->nextStu;
    }

}
//未知情况查询循环节点
StudentDouble * SelectCircleNodeInDoubleLinkTable(StudentDouble *head){
    //快慢指针查询
    StudentDouble *fast = head;
    StudentDouble *slow = head;

    while (fast) {
        fast = fast->nextStu->nextStu;
        slow = slow->nextStu;

        if (fast==NULL) {//不是循环链表推出
            break;
        }
        if (fast==slow) {//快慢指针相遇
            break;
        }
    }
    if (fast == NULL) {
        printf("该链表 不是循环链表\n");
        return NULL;
    }

    //查找循环节点
    fast = head;
    while (fast!=slow) {
        fast=fast->nextStu;
        slow=slow->nextStu;
    }
    printf("=====找到循环链表循环节点为%d\n",fast->point);
    return fast;
}
int main(void){
    char sf[15];
  //创建双向循环链表
    StudentDouble *head = NULL;

    printf("创建双向循环链表Y|N\n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
        head = CreateDoubleCircleLink_Table();
    }
    printf("已知情况查询循环链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
        SelectDoubleLinkTable(head);
    }
    printf("未知情况查询循环链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
        SelectCircleNodeInDoubleLinkTable(head);
    }
    return 0;
}
时间: 2024-10-09 16:21:51

复习下C 链表操作(双向循环链表,查找循环节点)的相关文章

复习下C 链表操作(双向链表)

双向链表 创建.删除.反转.插入 //struct #include <stdio.h> #include <stdlib.h> #include <string.h> /**********************双向链表************************************/ typedef struct Student_Double { char name[10]; int point; struct Student_Double *preStu

c 链表之 快慢指针 查找循环节点

参考:http://blog.csdn.net/wenqian1991/article/details/17452715 上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指针. 假设上图 快慢指针 在E点相遇,那 相遇点离循环节点D 之间距离是X.  头结点A 离循环节点D 距离为K. 那么在两指针相遇时,各自走过得距离(这里可以吧上图想成是 一个

复习下C 链表操作(单向链表)

Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不用的 包装体(struct 结构体).使用GCC/Clang (可以google 下.Clang 比GCC 更优化,) 编译指令. 转换OC 为 C . 终端 使用Clang 命令参考 clang -rewrite-objc file.m 查看file.cpp 文件为编译转换的C 单向链表 创建 .

【算法设计-链表】单链表与双向循环链表

1.单链表代码:包含了尾插法,插入,删除操作. 有头结点的单链表也是为了在第一个位置插入和删除时候容易,不需要另外讨论 #include<stdio.h> #include<stdlib.h> typedef struct Linklist { int key; Linklist *next; }Linklist; Linklist* create_end() { Linklist *head=(Linklist *)malloc(sizeof(Linklist)); Linkli

JAVA 链表操作:循环链表

主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.cnblogs.com/xiaoxing/p/5969133.html 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycleLinkLi

linked-list-cycle-ii——链表,找出开始循环节点

Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follow up:Can you solve it without using extra space? 快慢指针找重合判断是否循环.而后fast从头开始+1,slow继续前进直到重合 1 /** 2 * Definition for singly-linked list. 3 * struct ListN

(java实现)双向循环链表

什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的结构.因为双向循环链表的节点不仅包含指向下一个节点的指针(next),还包含指向前一个节点的指针(prev). 在双向循环链表中,可见的不只有头指针head,还有尾节点end.这是和单链表的区别. 双向循环链表的头指针head的前一个节点指向end,尾节点end的后一个节点指向head. 基本操作

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性