文章目录
- 单链表定义
- 版本一(可自己选择是否含头节点)
- 创建单链表
- 打印单链表
- 对单链表进行冒泡排序
- 删除单链表中值为key的节点
- 求单链表表长
- 在单链表位序为i的位置插入新元素e
单链表定义
typedef struct node
{int data;struct node* next;
}LinkNode,*LinkList;
版本一(可自己选择是否含头节点)
创建单链表
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;
}
打印单链表
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");}
}
对单链表进行冒泡排序
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的节点
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;
}
求单链表表长
int GetListSize(LinkList L, int is_have_head) {LinkNode* p = L;if (p == NULL) return 0;if (is_have_head) p = p->next;int count = 0;while (p) {count++;p = p->next;}return count;
}
在单链表位序为i的位置插入新元素e
int ListInsert(LinkList L, int i, int e, int is_have_head) {int list_size = GetListSize(L, is_have_head);if (i < 1 || i > list_size + 1) return 0; LinkNode* p = L, * pre = NULL;int cur = 1;if (is_have_head) {pre = p;p = p->next;}while (cur < i) {pre = p;p = p->next;cur++;}LinkNode* new_node = (LinkNode*)malloc(sizeof(LinkNode));new_node->data = e;if (pre == NULL) { new_node->next = L;L = new_node;}else {new_node->next = p;pre->next = new_node;}return 1;
}