单循环链表
如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是把尾节点的下一跳指向头结点。
初始化
typedef struct Node {
int data;
struct Node* next;
}Node;
Node* initList() {
Node* L = (Node*)malloc(sizeof(Node));
L -> data = 0;
L -> next = L;
return L;
}
头插法
首先把data赋值给新建的结点node的data域,把node的next指向原本头节点的next,这样原本的链表就跟在了node后,
接着把头节点的next指向node,这样node就跟在了头节点后,这样新建的结点node就插入到链表中,最后头节点的data域加一,表示元素个数增加一个
void headInsert(Node* L, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
node -> next = L -> next;
L -> next = node;
L -> data ++;
}
尾插法
首先把data传到新建的node的data域,循环跳到最后一个结点,给新建结点的next指向都节点L,然后给原本最后一个结点的next指向新建结点node,最后头节点data+1,表示链表增加一个结点
void tailInsert(Node* L, int data) {
Node* n = L;
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
while(n -> next != L){
n = n -> next;
}
node -> next = L;
n -> next = node;
L -> data ++;
}
删除
int Delete(Node* L, int data) {
Node* preNode = L;
Node* node = L -> next;
while(node != L){
if(node -> data == data){
preNode -> next = node -> next;
free(node);
L -> data --;
return TRUE;
}
preNode = node;
node = node -> next;
}
return FALSE;
}
遍历
void printList(Node* L) {
Node* node = L -> next;
while(node != L){
printf("%d->", node -> data);
node = node -> next;
}
printf("NULL\n");
}
整体代码:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct Node {
int data;
struct Node* next;
}Node;
Node* initList() {
Node* L = (Node*)malloc(sizeof(Node));
L -> data = 0;
L -> next = L;
return L;
}
void headInsert(Node* L, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
node -> next = L -> next;
L -> next = node;
L -> data ++;
}
void tailInsert(Node* L, int data) {
Node* n = L;
Node* node = (Node*)malloc(sizeof(Node));
node -> data = data;
while(n -> next != L){
n = n -> next;
}
node -> next = L;
n -> next = node;
L -> data ++;
}
int Delete(Node* L, int data) {
Node* preNode = L;
Node* node = L -> next;
while(node != L){
if(node -> data == data){
preNode -> next = node -> next;
free(node);
L -> data --;
return TRUE;
}
preNode = node;
node = node -> next;
}
return FALSE;
}
void printList(Node* L) {
Node* node = L -> next;
while(node != L){
printf("%d->", node -> data);
node = node -> next;
}
printf("NULL\n");
}
int main()
{
Node* L = initList();
headInsert(L, 1);
headInsert(L, 2);
headInsert(L, 3);
headInsert(L, 4);
headInsert(L, 5);
tailInsert(L, 6);
tailInsert(L, 7);
printList(L);
Delete(L, 4);
Delete(L, 7);
printList(L);
return 0;
}
执行结果:
总结
单循环链表的初始化,头插法,尾插法,结点的删除,单链表的遍历。
个人学习笔记,如有错误,还请指正。