复习下C 链表操作(单向循环链表、查找循环节点)
2014-11-25 15:59
441 查看
循环链表 稍复杂点。
肯能会有0 或 6 字型的单向循环链表。 接下来创建 单向循环链表 并 查找单向循环链表中的循环节点。
这里已6字型单向循环链表为例。
参考这便:http://blog.csdn.net/wenqian1991/article/details/17452715
肯能会有0 或 6 字型的单向循环链表。 接下来创建 单向循环链表 并 查找单向循环链表中的循环节点。
这里已6字型单向循环链表为例。
//创建 循环链表 Student * CreateCircleLink_Table(void){ int i = 0; Student *head = NULL; head = (Student *)malloc(sizeof(Student)); head->name[0]='\0'; head->point = 0; head->stu = NULL; //循环节点 Student *circleStu = NULL; Student *temp = NULL; Student *currentNode = head; while (i<=9) { temp = (Student *)malloc(sizeof(Student)); strncpy(temp->name,"Node",sizeof(temp->name)); temp->point = i; temp->stu = NULL; currentNode->stu = temp; currentNode = temp; //循环节点 if (i==3) { circleStu = currentNode; } i++; } //最后 合并循环节点 currentNode->stu = circleStu; return head; } //已知循环节点 查询 主要为了验证循环链表是否可用 void SelectCircleLinkTable(Student *student){ Student *next = student->stu; int i = 0; Student *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->stu; } } //查找循环链表中循环节点 Student * SelectCircleNodeInLinkTable(Student *student) { Student *fast = student; Student *slow = student; Student *circleStu = NULL; while (fast->stu) { fast = fast->stu->stu;//快指针节点 为慢指针节点的2倍 slow = slow->stu; if (fast==NULL) { //不存在循环节点 return NULL; } if (fast == slow) {//快慢指针相遇。找到循环节点 circleStu = fast; break; } } if (fast==NULL) { //不存在循环节点 return NULL; } printf("相遇节点为==%d\n",circleStu->point); fast=student; while (fast!=slow) { slow=slow->stu; fast=fast->stu; } return fast; } int main(void){ char sf[15]; // /** // * 创建单向链表 // */ // int num; // printf ("请输入学生人数\n"); // scanf("%d",&num); // Student *link_stu = CreateLink_Table(num); // // // /** // * 单向链表插入节点 // */ // printf ("请插入节点内容 在 已存在节点名字的后面,如 已存在节点名字|待插入名字|待插入分数 \n"); // scanf("%s",sf); // // link_stu = insertStudentLinkTable(link_stu,sf); // // /** // * 反转单向链表 // */ // printf("反转链表Y|N \n"); // scanf("%s",sf); // if (strcmp(sf,"Y")==0) { // Student *newLt= ReversionStudentLinkTable(link_stu); // //查询 // selectStudent(newLt); // } /** * 创建循环链表 */ Student *student = NULL; printf("开始创建循环链表Y|N \n"); scanf("%s",sf); if (strcmp(sf,"Y")==0) { student = CreateCircleLink_Table(); } printf("已知情况查询循环链表Y|N \n"); scanf("%s",sf); if (strcmp(sf,"Y")==0) { SelectCircleLinkTable(student); } printf("未知情况查询循环链表Y|N \n"); scanf("%s",sf); if (strcmp(sf,"Y")==0) { Student *circleStu = SelectCircleNodeInLinkTable(student); printf("=====循环节点==%d\n",circleStu->point); } return 0; }
参考这便:http://blog.csdn.net/wenqian1991/article/details/17452715
相关文章推荐
- 复习下C 链表操作(双向循环链表,查找循环节点)
- 单向链表,单向循环链表的基本操作
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 微软算法100题13 查找单向链表倒数第K个节点
- 单向链表的相关操作总结:创建、删除、查找、排序、统计链表大小、链表的反转和遍历等
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 带头节点链表的操作(链表的创建、删除、查找、逆转、打印等等)
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 使用单向循环链表实现字典操作 INSERT、DELETE 和 SEARCH
- 查找循环链表中是否存在循环,并找到循环的节点
- 程序员面试100题(算法)之查找链表中倒数第k个节点(含单向链表的创建和打印)
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- C实现简单单向链表,一次遍历查找倒数第k个节点的值
- 向有序循环单向链表中插入节点
- 单向链表的操作:创建,删除,插入,销毁,查找
- 链表循环保留M个节点 然后删除N个节点 重复操作到链表尾部
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 数据结构复习之二叉树:遍历、搜索节点&路径、查找、与单链表互转、逐层打印
- 单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点