链表 数据结构=结构定义+结构操作
1.链表体
2.链表头
3.链表插入
4.链表删除元素
5.链表释放
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/// 链表体
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
//链表头
typedef struct LinkList {
ListNode head;
int length;
} LinkList;
//初始化链表体
ListNode* init_listnode(int val) {
ListNode* p = (ListNode*)malloc(sizeof(ListNode));
p->data = val;
p->next = NULL;
return p;
}
//初始化链表头
LinkList* init_linklist() {
LinkList* l = (LinkList*)malloc(sizeof(LinkList));
l->head.next = NULL;
l->length = 0;
return l;
}
//清除链表 释放内存
void clear_listnode(ListNode* node) {
if (node == NULL) return;
free(node);
return;
}
//清除
void clear_linklist(LinkList* l) {
if (l == NULL) return;
ListNode* p = l->head.next, * q;
while (p) {
q = p->next;
clear_listnode(p);
p = q;
}
free(l);
return;
}
//插入
int insert(LinkList* l, int ind, int val) {
if (l == NULL) return 0;
if (ind < 0 || ind > l->length) return 0;
ListNode* p = &(l->head), * node = init_listnode(val);
while (ind--) {
p = p->next;
}
node->next = p->next;
p->next = node;
l->length += 1;
return 1;
}
//删除
int erase(LinkList* l, int ind) {
if (l == NULL) return 0;
if (ind < 0 || ind >= l->length) return 0;
ListNode* p = &(l->head), * q;
while (ind--) {
p = p->next;
}
q = p->next->next;
clear_listnode(p->next);
p->next = q;
l->length -= 1;
return 1;
}
//输出
void output(LinkList* l) {
printf("LinkList(%d) : ", l->length);
for (ListNode* p = l->head.next; p; p = p->next) {
printf("%d -> ", p->data);
}
printf("NULL\n");
return;
}
#define MAX_OP 30
int main() {
srand(time(0));
LinkList* l = init_linklist();
for (int i = 0; i < MAX_OP; i++) {
int op = rand() % 3;
int ind = rand() % (l->length + 1);
int val = rand() % 100;
switch (op) {
case 0:
case 1: {
printf("insert %d at %d to LinkList = %d\n",
val, ind, insert(l, ind, val));
} break;
case 2: {
printf("erase item at %d from LinkList = %d\n",
ind, erase(l, ind));
} break;
}
output(l);
printf("\n");
}
clear_linklist(l);
return 0;
}