链表是一种基于指针实现的线性表,它的特点是动态存储,可以方便地进行插入和删除操作。以下是一个简单的单向链表的实现(C语言版)。

#include

#include

typedef struct ListNode {

int data; // 数据元素

struct ListNode *next; // 指向下一个节点的指针

} ListNode, *ListPtr;

// 初始化链表

void InitList(ListPtr *L) {

*L = NULL;

}

// 判断链表是否为空

int isEmpty(ListPtr L) {

return L == NULL ? 1 : 0;

}

// 获取链表长度

int getLength(ListPtr L) {

int len = 0;

for (ListPtr p = L; p != NULL; p = p->next) {

len++;

}

return len;

}

// 获取指定位置的元素

int getElem(ListPtr L, int i) {

if (i < 1 || i > getLength(L)) {

printf("Error: Index out of range.\n");

exit(1);

}

ListPtr p = L;

for (int j = 1; j < i; j++) {

p = p->next;

}

return p->data;

}

// 在指定位置插入元素

void insertElem(ListPtr *L, int i, int e) {

if (i < 1 || i > getLength(*L)+1) {

printf("Error: Index out of range.\n");

exit(1);

}

ListPtr newNode = (ListPtr)malloc(sizeof(ListNode));

newNode->data = e;

if (i == 1) { // 插入到头结点

newNode->next = *L;

*L = newNode;

} else { // 插入到其他位置

ListPtr p = *L;

for (int j = 1; j < i-1; j++) {

p = p->next;

}

newNode->next = p->next;

p->next = newNode;

}

}

// 删除指定位置的元素

void deleteElem(ListPtr *L, int i) {

if (i < 1 || i > getLength(*L)) {

printf("Error: Index out of range.\n");

exit(1);

}

if (i == 1) { // 删除头结点

ListPtr p = *L;

*L = (*L)->next;

free(p);

} else { // 删除其他位置

ListPtr p = *L;

for (int j = 1; j < i-1; j++) {

p = p->next;

}

ListPtr q = p->next;

p->next = q->next;

free(q);

}

}

// 输出链表中的所有元素

void printList(ListPtr L) {

printf("List: ");

for (ListPtr p = L; p != NULL; p = p->next) {

printf("%d ", p->data);

}

printf("\n");

}

int main() {

ListPtr L;

InitList(&L);

// 插入元素

insertElem(&L, 1, 1);

insertElem(&L, 2, 2);

insertElem(&L, 3, 3);

insertElem(&L, 4, 4);

insertElem(&L, 5, 5);

printList(L); // List: 1 2 3 4 5

// 删除元素

deleteElem(&L, 3);

printList(L); // List: 1 2 4 5

// 获取元素

printf("Element at index 2 is %d\n", getElem(L, 2)); // Element at index 2 is 2

// 获取长度

printf("Length of the list is %d\n", getLength(L)); // Length of the list is 4

return 0;

}

在这个实现中,我们使用结构体 ListNode 来表示链表中的节点,其中 data 表示数据元素,next 表示指向下一个节点的指针。我们实现了初始化链表、判断链表是否为空、获取链表长度、获取指定位置的元素、在指定位置插入元素、删除指定位置的元素、输出链表中所有元素等操作。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: