在双向链表的基础上多了一个头节点只想尾节点,当双向循环链表只有一个节点时,节点的前后指针域都是指向节点本身。链表采用二级指针的形式来封装,具体代码如下。
#include<stdio.h>
#include<stdlib.h>
//无头循环链表(二级指针形式)
typedef struct _Node{
int data;
struct _Node* front;
struct _Node* tail;
}Node;
Node* createNode(int data){
Node* headNode = (Node*)malloc(sizeof(Node));
headNode->data = data;
headNode->front = headNode;
headNode->tail = headNode;
return headNode;
}
void addNodeByHead(Node** listNode, int data){
Node* newNode = createNode(data);
Node* tailNode = (*listNode)->front;
tailNode->tail = newNode;
newNode->front = tailNode;
newNode->tail = (*listNode);
(*listNode)->front = newNode;
*listNode = newNode;
}
void addNodeByTail(Node** listNode, int data){
Node* newNode = createNode(data);
Node* tailNode = (*listNode)->front;
tailNode->tail = newNode;
newNode->front = tailNode;
newNode->tail = (*listNode);
(*listNode)->front = newNode;
}
void addNodeByAppointed(Node** listNode, int data, int posData){
if ((*listNode)->front == (*listNode)->tail && (*listNode)->data == posData){
addNodeByHead(listNode, data);
return;
}
else if ((*listNode)->front == (*listNode)->tail && (*listNode)->data != posData)
{
printf("1未找到元素,无法做指定位置插入!\n");
return;
}
else{
Node* pMoveNode = (*listNode);
while (pMoveNode->tail != NULL&&pMoveNode->data != posData){
pMoveNode = pMoveNode->tail;
if (pMoveNode == (*listNode)){
printf("2未找到元素,无法做指定位置插入!\n");
return;
}
}
Node* newNode = createNode(data);
Node* pMoveFrontNode = pMoveNode->front;
pMoveFrontNode->tail = newNode;
newNode->front = pMoveFrontNode;
newNode->tail = pMoveNode;
pMoveNode->front = newNode;
}
}
void printList(Node* listNode){
if (listNode==NULL){
printf("链表为空,无法打印!\n");
}
else{
Node* pMoveNode = listNode;
while (listNode->tail != NULL){
printf("%d ", listNode->data);
listNode = listNode->tail;
if (listNode == pMoveNode)
break;
}
}
printf("\n");
}
void deleteNodeByTail(Node** list){
if ((*list)->front == (*list) && (*list)->tail == (*list)|| (*list) == NULL){
printf("链表仅有一个元素%d,且已删除!\n", (*list)->data);
free((*list));
exit(0);
}
else{
Node* tailNode = (*list)->front;
tailNode->front->tail = (*list);
(*list)->front = tailNode->front;
free(tailNode);
tailNode = NULL;
}
}
void deleteNodeByHead(Node** list){
if ((*list)->front == (*list) && (*list)->tail == (*list) || (*list) == NULL){
printf("链表仅有一个元素%d,且已删除!\n", (*list)->data);
free((*list));
exit(0);
}
else{
Node* tailNode = (*list)->front;
tailNode->tail = (*list)->tail;
(*list)->tail->front = tailNode;
free(*list);
(*list) = tailNode->tail;
}
}
int main(){
Node* listNode = NULL;
listNode = createNode(10);
addNodeByHead(&listNode, 20);
addNodeByHead(&listNode, 30);
addNodeByHead(&listNode, 40);
addNodeByTail(&listNode, -10);
addNodeByAppointed(&listNode, 100, 10);
deleteNodeByTail(&listNode);
deleteNodeByHead(&listNode);
printList(listNode);
return 0;
}