美文网首页PHP经验分享
【轻知识】循环链表、双向链表、双向循环链表、约瑟夫环

【轻知识】循环链表、双向链表、双向循环链表、约瑟夫环

作者: 言十年 | 来源:发表于2019-04-24 01:20 被阅读15次

写完链表之后,这些就简单多了。额,这么说,也不对,万一迷糊了。就会耗很多时间想。

循环链表

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node* pNext;
} NODE,*PNODE;

PNODE create_list();
void traverse_list(PNODE);
PNODE reverse_list(PNODE);
int check_circle(PNODE pHead);
PNODE create_circle_list();
int main() {
    PNODE pHead = create_list();
    traverse_list(pHead);
    return 0;
}
PNODE create_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    int i;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        tempNode = newNode;
        if ((len-1) == i) { // 既然是循环链表,最后一个指向第一个结点
            newNode->pNext = pHead->pNext;
        }
    }
    return pHead;
}
void traverse_list(PNODE pHead) {
    PNODE t = pHead->pNext;
    while(t != pHead->pNext) {
    //while(t != NULL) {
        printf("data=%d\n", t->data);
        t = t->pNext;
    }
    return ;
}

双向链表

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node* pNext;
    struct Node* pFront;
} NODE,*PNODE;

PNODE create_list();
void traverse_list(PNODE);
PNODE reverse_list(PNODE);
int check_circle(PNODE pHead);
PNODE create_circle_list();
int main() {
    PNODE pHead = create_list();
    traverse_list(pHead);
    return 0;
}
PNODE create_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    int i;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        newNode->pFront  = tempNode;
        tempNode = newNode;
        //if ((len-1) == i) { // 既然是双向链表,最后一个指向第一个结点
        //  newNode->pNext = pHead->pNext;
        //}
    }
    return pHead;
}
void traverse_list(PNODE pHead) {
    PNODE t = pHead->pNext;
    while(t != NULL) {
        printf("front_data%d\n", t->pFront->data);
        printf("next_data=%d\n", t->data);
        printf("split line-------\n");
        t = t->pNext;
    }
    return ;
}

双向循环链表

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node* pNext;
    struct Node* pFront;
} NODE,*PNODE;

PNODE create_list();
void traverse_list(PNODE);
PNODE reverse_list(PNODE);
int check_circle(PNODE pHead);
void traverse_list2(PNODE pHead);
PNODE create_circle_list();
int main() {
    PNODE pHead = create_list();
    //traverse_list(pHead);
    traverse_list2(pHead);
    return 0;
}
PNODE create_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    PNODE oneNode = NULL;
    int i;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        newNode->pFront  = tempNode;
        tempNode = newNode;
        //if (i == 0) {
        //  oneNode = newNode;;
        //}
        if ((len-1) == i) { // 既然是双向链表,最后一个指向第一个结点
            newNode->pNext = pHead->pNext;
            pHead->pNext->pFront = newNode;
        }
    }
    return pHead;
}
void traverse_list(PNODE pHead) {
    PNODE tt= pHead->pNext;
    PNODE t = NULL;
    //while(t != NULL) {
    while(t != pHead->pNext && (t=tt)) {
        printf("front_data%d\n", t->pFront->data);
        printf("next_data=%d\n", t->data);
        printf("split line-------\n");
        tt = tt->pNext;
        t = tt;
        sleep(1);
    }
    return ;
}
void traverse_list2(PNODE pHead) {
    PNODE t = pHead->pNext;
    //while(t != NULL) {
    int flag = 0;
    while(t != pHead->pNext ||  (flag==0)) {
        flag = 1;
        printf("front_data%d\n", t->pFront->data);
        printf("next_data=%d\n", t->data);
        printf("split line-------\n");
        t = t->pNext;
        sleep(1);
    }
    return ;
}

约瑟夫环

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node* pNext;
} NODE,*PNODE;

PNODE create_list();
int josephus(PNODE, int ,int);
int main() {
    PNODE pHead = create_list();
    int k,num;
    printf("please input k pos\n");
    scanf("%d",&k);
    printf("please input num\n");
    scanf("%d", &num);
    josephus(pHead, k, num);
    return 0;
}
PNODE create_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    int i;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        tempNode = newNode;
        if ((len-1) == i) { // 既然是双向链表,最后一个指向第一个结点
            newNode->pNext = pHead->pNext;
        }
    }
    return pHead;
}
int josephus(PNODE pHead, int k, int m) {
    PNODE t = pHead->pNext;
//  while(t != pHead->pNext) {
    int count = 0;
    PNODE tempNode = NULL;
    PNODE frontNode = pHead;
    int flag = 0;
    while(t != NULL) {
        tempNode = t->pNext;
        //printf("data=%d\n", t->data);
        if (t->data == k && flag == 0) {
            count++;
            k = 0;
            flag = 1;
        }
        if (count == m) {
            printf("out %d\n", t->data);
            //1.出局
            if (t == t->pNext) {
                pHead->pNext = NULL;
                return 1;
            } else {
                frontNode->pNext = t->pNext;
            }
            free(t);
            //2.count 重置
            count = 0;
        }
        if (flag == 1) {
            count++;
        }
        frontNode = t;
        t = tempNode;
        //sleep(1);
    }
    return 0;
}

相关文章

  • 【轻知识】循环链表、双向链表、双向循环链表、约瑟夫环

    写完链表之后,这些就简单多了。额,这么说,也不对,万一迷糊了。就会耗很多时间想。 循环链表 双向链表 双向循环链表...

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • 0x05双向循环链表

    1 双向循环链表创建 2 双向循环链表插入元素 3 遍历双向循环链表 4双向循环链表删除结点

  • 双向链表

    双向链表的结构 既然单链表有循环链表,双向链表当然也有双向循环链表,如下图: 问: 双向链表中某个节点p的后继节点...

  • C语言——第五次笔记

    学生管理系统1.明确功能2.数据存储3.准备知识3.1 枚举3.2 链表 (单链表,循环链表,双向链表,双向循环链...

  • 数据结构与算法之数组与链表

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

  • 数据结构与算法之栈与队列

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 线性表--链式存储结构--双向链表

    双向链表 一、双向链表结构 双向链表结点结构 既然单链表可以有循环链表,那么双向链表当然也可以有。 由于这是双向链...

网友评论

    本文标题:【轻知识】循环链表、双向链表、双向循环链表、约瑟夫环

    本文链接:https://www.haomeiwen.com/subject/zubigqtx.html