创建一个单循环链表

116 阅读1分钟

1 题目

功能:创建一个单循环链表 描述:输入链表中各个结点中的值,然后进行进行整合成单循环链表进行输出

2 思路

一个循环链表是从简单的链表中发展而来,简单链表带来的弊端是,必须要保存头结点才能不断的遍历链表,否则当遍历到 结点尾部的时候,便没办法进行后续的工作。 简单循环链表带来的优势是,当遍历到链表尾部的时候,由于尾部的next指针指向头部,所以是要比简单的单链表灵活一些的

3 代码

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
​
/**
功能:创建一个单循环链表
描述:输入链表中各个结点中的值,然后进行进行整合成单循环链表进行输出
**/
​
typedef struct Node {
    char num;
    struct Node *next;
} LNode, *LinkList;
​
LinkList create(void) {
​
    LinkList head;
    LNode *p1,  *p2;
    char a;
    head = NULL;
    a = getchar();
    while (a != '#') {
        p1 = (LNode*)malloc(sizeof(LNode));   // 分配空间
        p1->num = a;        // 数据域赋值
        if (head == NULL)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        a = getchar();
    }
    p2->next = head;        // 尾节点指向头结点
    return head;
}
​
int main(int argc, char const *argv[]) { 
​
    LinkList L1, head;
    printf("请输入循环链表:(以 # 结束)\n");
    L1 = create();          // 创建循环链表
    head = L1;
    printf("形成的循环链表是:\n");
    printf("%c -> ", L1->num);
    L1 = L1->next;          // 指向下一个结点
    while (L1 != head) {      // 判断条件为循环到头结点结束
       
        printf("%c -> ", L1->num);
        L1 = L1->next;
    }
  printf("\n");
}

示例结果:

$ gcc ex072.c -o demo
$ ./demo
请输入循环链表:(以 # 结束)
apple#
形成的循环链表是:
a -> p -> p -> l -> e ->