单链表相关操作(基于C语言)
文章目录
- 单链表定义
- 创建单链表
- 打印单链表
- 对单链表进行冒泡排序
- 删除单链表中值为key的节点
- TODO
单链表定义
typedef struct node
{
int data;
struct node* next;
}LinkNode,*LinkList;
创建单链表
/**
* @brief 创建单链表
* @param head 单链表存储位置
* @param data 存储单链表的整数数组
* @param size 数组大小
* @param is_have_head 是否创建头节点,是为1,否则为0
*/
LinkList CreateList(int data[], int size, int is_have_head) {
LinkList head = NULL;
LinkNode* p = NULL;
head = (LinkNode*)malloc(sizeof(LinkNode)); // 创建头结点
head->next = NULL;
p = head;
for (int i = 0; i < size; i++) {
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = data[i];
newNode->next = NULL;
if (head == NULL) {
head = newNode;
p = head;
}
else {
p->next = newNode;
p = p->next;
}
}
if (!is_have_head && head != NULL) { // 删除头结点
LinkNode* temp = head;
head = head->next;
free(temp);
}
return head;
}
打印单链表
/**
* @brief 打印单链表
* @param head 单链表指针
* @param is_have_head 是否含头节点,是为1,否则为0
*/
void PrintList(LinkList head, int is_have_head) {
LinkNode* p = head;
if (is_have_head) p = p->next;
if (!p) printf("空链表!\a\n");
else {
while (p) {
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}
}
对单链表进行冒泡排序
/**
* @brief 对单链表进行冒泡排序
* @param L 单链表指针L
* @param is_have_head 是否含头节点,是为1,否则为0
*/
void LinkBubbleSort(LinkList L, int is_have_head) {
LinkNode* head = L;
if (is_have_head) head = head->next;
LinkNode* p = head, * q = p->next, * last = NULL;
if (p == NULL || q == NULL) return;
while (head->next != last) {
while (q && q != last ) {
if (p->data > q->data) {
int temp = p->data;
p->data = q->data;
q->data = temp;
}
p = q;
q = q->next;
}
last = p;
p = head;
q = p->next;
}
}
删除单链表中值为key的节点
/**
* @brief 删除单链表中值为key的节点
* @param L 单链表L
* @param key 目标值key
* @param is_have_head 是否含头节点,是为1,否则为0
* @return 删除成功返回true,否则返回false
*/
bool ListDeleteNode(LinkList L, int key, int is_have_head) {
LinkNode* p = L, * pre = NULL;
if (is_have_head) {
pre = p;
p = p->next;
}
while (p && p->data != key) {
pre = p;
p = p->next;
}
if (!p) return false;
pre->next = p->next;
free(p);
return true;
}
TODO
Date: 2025-02-21