链表,包含插入、删除、查找、清空
#include <stdio.h>
#include <malloc.h>
typedef enum
{
ERROR = 0,
SUCCESS = 1,
} State;
typedef int Data;
typedef struct Node
{
Data data;
struct Node *next;
} *Node;
typedef struct Head
{
int length;
Node next;
} *Head;
Head initLinkedList()
{
Head head = malloc(sizeof(struct Head));
head->length = 0;
head->next = NULL;
return head;
}
State getEleByIndex(Head head, int index, Data *ele)
{
if (head->length == 0 || index > head -> length - 1) {
perror("index超出链表长度");
return ERROR;
}
Node point = head->next;
int currentIndex = 0;
while (point->next && currentIndex < head->length) {
if (index == currentIndex) {
*ele = point->data;
return SUCCESS;
}
point = point->next;
currentIndex++;
}
printf("未找到下标%d的元素", index);
return ERROR;
}
State linkedInsert(Head head, int index, Data ele)
{
if(index > head->length) {
perror("index超出链表当前大小");
return ERROR;
}
Node node = malloc(sizeof(struct Node));
node->data = ele;
if (head->length == 0) {
node->next = head->next;
head->next = node;
head->length++;
return SUCCESS;
}
if (index == 0) {
node->next = head->next;
head->next = node;
head->length++;
return SUCCESS;
}
Node point = head->next;
int currentIndex = 1;
while (point->next && currentIndex < index) {
point = point->next;
currentIndex++;
}
Node temp = point->next;
node->next = temp;
point->next = node;
head->length++;
return SUCCESS;
}
State linkedDeleteByIndex(Head head, int index, Data *ele)
{
if (head->length == 0 || index > head->length - 1) {
perror("index超出链表长度");
return ERROR;
}
Node point = head->next;
int currentIndex = 0;
if (index == 0) {
Node temp = head->next;
*ele = temp->data;
head->next = head->next->next;
head->length--;
free(temp);
return SUCCESS;
}
while (point) {
if (currentIndex == index - 1) break;
point = point->next;
currentIndex++;
}
Node temp = point->next;
*ele = temp->data;
point->next = point->next->next;
head->length--;
free(temp);
return SUCCESS;
}
State linkedClear(Head head)
{
if (!head || head->length == 0) {
perror("当前链表已为空");
return ERROR;
}
Node node = head->next;
head->next = NULL;
head->length = 0;
while (node) {
Node temp = node;
node = node->next;
free(temp);
}
return SUCCESS;
}
int main() {
Head head = initLinkedList();
for (int i = 0; i < 10; i++) {
linkedInsert(head, i, i + 1);
}
linkedInsert(head, 10, 100);
Data ele;
linkedDeleteByIndex(head, 10, &ele);
printf("删除元素%d\n", ele);
linkedClear(head);
Node node = head->next;
while (node) {
printf("%d\n", node->data);
node = node->next;
}
return 0;
}