2.单循环链表
data|next——>data|next——>data|next——>头节点
1.初始化链表
2.增加节点(头插法、尾插法)
3.删除节点
4.遍历链表
定义一个链表(结构体),定义一个数据结构,存放data域和指针域:
typedef struct Node {//定义一个结构体,存放data域和指针域int data;//数据域类型struct Node* next;
}Node;//定义一个链表Node
初始化链表:
Node* initList() {//初始化链表Node* L = (Node*)malloc(sizeof(Node));//开辟空间 L:头指针L->data = 0;//data域L->next = L;//下一个节点指向return L;
}
头插法:
void headInsert(Node* L, int data) {//头插法 传入头指针LNode* node = (Node*)malloc(sizeof(Node));//创建指针变量并开辟空间node->data = data;node->next = L->next;//头指针指向新节点 新节点指向原先头节点L->next = node;
}
尾插法 :
void tailInsert(Node* L, int data) {//尾插法Node* n = L;//链表LNode* node = (Node*)malloc(sizeof(Node));//新建指针变量node->data = data;while (n->next != L) {//判断是否是最后一个节点n = n->next;}node->next = L;//指针变量指向Ln->next = node;//n指向的next等于node
}
删除:
#define TRUE 1
#define FALSE 0int Delete(Node* L, int data)//删除
{Node* preNode = L;//记录每次循环的前一个结点Node* node = L->next;while (node != L){if (node->data == data) {//deletepreNode->next = node->next;free(node);return TRUE;}preNode = node;//如果没有的话node = node->next;}return FALSE;
}
遍历链表:
void printList(Node* L) {//遍历链表Node* node = L->next;//定义一个链表给他赋值L链表while (node != L) {//链表不为空printf("%d->", node->data);//打印node = node->next;//node指向node的next指针}printf("NULL\n");
}
main函数:
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);tailInsert(L, 8);tailInsert(L, 9);tailInsert(L, 10);printList(L);Delete(L, 4);Delete(L, 5);printList(L);return 0;
}
单循环链表函数
typedef struct Node {//定义一个结构体,存放data域和指针域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;
}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;
}#define TRUE 1
#define FALSE 0int Delete(Node* L, int data)//删除
{Node* preNode = L;Node* node = L->next;while (node != L){if (node->data == data) {//deletepreNode->next = node->next;free(node);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);tailInsert(L, 8);tailInsert(L, 9);tailInsert(L, 10);printList(L);Delete(L, 4);Delete(L, 5);printList(L);return 0;
}
运行结果: