一、代码
#include <stdio.h>
#include <stdlib.h>
struct listnode
{
char data;
struct listnode* nextnode;
};
struct listnode* tail_creat()//尾插法
{
struct listnode *p, *head, *s;
char ch;
head = NULL;
p = NULL;
printf("请输入要插入的字符:\n");
ch = getchar();
while (ch != '\n')
{
s = (struct listnode *)malloc(sizeof(listnode));
if (s != 0)
{
s->data = ch;
s->nextnode = NULL;
if (head == NULL)
{
head = s;
p = s;
}
else
{
p->nextnode = s;
p = s;
};
};
ch = getchar();
}
p->nextnode = head;
return head;
}
void tranversal(struct listnode *h)//遍历
{
struct listnode *p, *q;
p = h;
printf("输出:");
while (p)
{
printf("%c", p->data);
q = p->nextnode;
p = q;
if (q == h)
printf("\n");
break;
}
};
void IsCircularLinkedList(struct listnode *h)//判断是否为循环链表
{
struct listnode *p, *q;
p = h;
q = h;
while (p || q)
{
p = p->nextnode;
q = q->nextnode;
if (q == NULL)
{
printf("This is not 循环链表!\n");
break;
}
else
{
q = q->nextnode;
}
if (q == NULL)
{
printf("This is not 循环链表!\n");
break;
}
if (q == p)
{
printf("This is 循环链表!\n");
break;
}
}
};
int main()
{
struct listnode *hd1;
hd1 = tail_creat();
tranversal(hd1);
panduan(hd1);
char c = getchar();
return 0;
}
二、注意事项:
循环链表在遍历时需要判断是否回到头节点,否则会循环遍历下去;
循环链表的判断方法:采用数学中操场追及问题的解决思路,设计一个跨步为1的指针和另一个跨步为2的指针;