博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复习下C 链表操作(双向循环链表,查找循环节点)
阅读量:5320 次
发布时间:2019-06-14

本文共 2683 字,大约阅读时间需要 8 分钟。

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

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;}

 

转载于:https://www.cnblogs.com/DamonTang/p/4128366.html

你可能感兴趣的文章
个人作业
查看>>
下拉刷新
查看>>
display:inline-block 和float:left 的区别
查看>>
java 图片与文字生成PDF
查看>>
通道(Channel)的原理获取
查看>>
我所知道的window.location
查看>>
ajax 请求发出了,数据更改了,但是没进入success 函数 把success 换成 complete...
查看>>
web前端开发知识点较高质量的网站
查看>>
2018寒假作业_3(电梯版本二)
查看>>
sql复杂查询
查看>>
修改mysql5.7的错误日志级别
查看>>
UVA - 839 Not so Mobile
查看>>
Python考试_第一次
查看>>
[Jquery 插件]活动倒计时,可同步服务器时间,倒计时格式随意设置
查看>>
【財務会計】償却 とは
查看>>
es5和es6对象导出与导入
查看>>
关于timestamp的自动更新
查看>>
【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
查看>>
自制MVC框架的插件与拦截器基础
查看>>
Gvim 配置
查看>>