c语言单链表的基本操作
时间: 2023-12-11 20:03:39 浏览: 83
C语言单链表的基本操作包括:创建链表、插入节点、删除节点、查找节点、遍历链表等。
1. 创建链表:需要定义一个结构体来表示链表节点,包括数据域和指向下一个节点的指针。然后通过动态内存分配函数malloc()来为节点分配内存空间,并将节点的指针域指向下一个节点或NULL,最后将头指针指向第一个节点即可。
2. 插入节点:需要先找到要插入位置的前一个节点,然后创建新节点并将其指针域指向下一个节点,再将前一个节点的指针域指向新节点即可。
3. 删除节点:需要先找到要删除的节点和其前一个节点,然后将前一个节点的指针域指向要删除节点的下一个节点,最后释放要删除节点的内存空间即可。
4. 查找节点:需要从头节点开始遍历链表,逐个比较每个节点的数据域是否与目标值相等,直到找到目标节点或遍历完整个链表。
5. 遍历链表:需要从头节点开始遍历链表,逐个输出每个节点的数据域。
相关问题
数据结构c语言单链表基本操作
单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。C语言中实现单链表的基本操作包括:创建链表、插入节点、删除节点、查找节点、遍历链表等。其中,插入节点和删除节点是单链表的核心操作。在插入节点时,需要先找到要插入位置的前一个节点,然后将新节点插入到该节点之后;在删除节点时,需要先找到要删除节点的前一个节点,然后将该节点从链表中删除。以下是单链表的基本操作代码示例:
1. 创建链表
```
LinkList CreateList() {
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return L;
}
```
2. 插入节点
```
bool ListInsert(LinkList L, int i, ElemType e) {
if (i < 1) {
return false;
}
LNode *p = L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
```
3. 删除节点
```
bool ListDelete(LinkList L, int i, ElemType &e) {
if (i < 1) {
return false;
}
LNode *p = L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || p->next == NULL) {
return false;
}
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
```
4. 查找节点
```
LNode *GetElem(LinkList L, int i) {
if (i < 1) {
return NULL;
}
LNode *p = L->next;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
```
5. 遍历链表
```
void TraverseList(LinkList L) {
LNode *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
c语言单链表基本操作代码,要求包含:初始化单链表,销毁单链表,判断单链表是否为空表,求单链表长度,输出单链表,求单链表中指定位置的某个元素的值,按元素值查找,单链表的插入算法,单链表上的删除算法,以上功能使用switch和case来制作一个功能菜单,要整型和字符型都能插入
在C语言中,我们首先需要定义链表节点结构体,然后实现一些基础操作。这里是一个简单的示例,展示了如何使用`struct`、`malloc`和`free`来进行链表的基本操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data; // 整型数据
char data_char; // 字符型数据
struct Node* next; // 指向下一个节点的指针
} Node;
// 初始化单链表
Node* initList() {
return (Node*) malloc(sizeof(Node));
}
// 销毁单链表
void destroyList(Node* head) {
if (head != NULL) {
Node* current = head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
}
}
// 判断单链表是否为空
int isEmpty(Node* head) {
return head == NULL;
}
// 获取单链表长度
size_t listLength(Node* head) {
size_t length = 0;
Node* current = head;
while (current != NULL) {
length++;
current = current->next;
}
return length;
}
// 输出单链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d - %c ", current->data, current->data_char);
current = current->next;
}
printf("\n");
}
// 查找指定索引元素
int getElementAt(int index, Node* head) {
Node* current = head;
for (size_t i = 0; i < index && current != NULL; i++) {
current = current->next;
}
if (current == NULL) {
return -1; // 索引超出范围
} else {
return current->data; // 返回元素值
}
}
// 插入整数
void insertInt(Node** head, int value) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 插入字符
void insertChar(Node** head, char value) {
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->data_char = value;
newNode->next = *head;
*head = newNode;
}
// 功能菜单(仅用于演示,实际应用中应提供用户输入)
void menu() {
int choice;
Node* head = initList();
while (1) {
printf("1. Initialize List\n");
printf("2. Destroy List\n");
printf("3. Check If Empty\n");
printf("4. Get List Length\n");
printf("5. Print List\n");
printf("6. Get Element at Index (Integer)\n");
printf("7. Insert Integer\n");
printf("8. Insert Character\n");
printf("9. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1: head = initList(); break;
case 2: destroyList(head); break;
case 3: printf("%s\n", isEmpty(head) ? "Empty" : "Not Empty"); break;
case 4: printf("List Length: %zu\n", listLength(head)); break;
case 5: printList(head); break;
case 6: int index; scanf("%d", &index); printf("Element: %d\n", getElementAt(index, head)); break;
case 7: int input_int; scanf("%d", &input_int); insertInt(&head, input_int); break;
case 8: char input_char; scanf(" %c", &input_char); insertChar(&head, input_char); break;
case 9: destroyList(head); exit(0); break;
default: printf("Invalid choice.\n");
}
}
}
int main() {
menu();
return 0;
}
```
阅读全文