用c语言写代码解决这个问题 实验二 线性表的链式存储实现 单链表的插入、删除、查找、求表长、置逆以及有序单链表的合并算法的实现。
时间: 2024-10-15 12:07:05 浏览: 27
C语言之单链表的插入、删除与查找
5星 · 资源好评率100%
在C语言中,我们可以使用结构体和指针来实现线性表的链式存储。这里给出一个简单的单链表实现,包含了插入、删除、查找、求长度、置逆以及合并两个有序链表的基本功能。
首先,我们定义一个链表节点结构:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
1. **插入操作**:
```c
void insert(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
```
2. **删除操作**:
```c
void deleteNode(Node** head, int value) {
if (*head == NULL) {
return;
}
if ((*head)->data == value) {
Node* temp = *head;
*head = (*head)->next;
free(temp);
return;
}
Node* current = *head;
while (current->next != NULL && current->next->data != value) {
current = current->next;
}
if (current->next != NULL) {
Node* temp = current->next;
current->next = current->next->next;
free(temp);
}
}
```
3. **查找操作**:
```c
Node* search(Node* head, int value) {
Node* current = head;
while (current != NULL) {
if (current->data == value)
return current;
current = current->next;
}
return NULL;
}
```
4. **求表长**:
```c
int getLength(Node* head) {
int length = 0;
Node* current = head;
while (current != NULL) {
length++;
current = current->next;
}
return length;
}
```
5. **置逆链表**:
```c
void reverseList(Node** head) {
Node* prev = NULL;
Node* current = *head;
Node* nextTemp = NULL;
while (current != NULL) {
nextTemp = current->next;
current->next = prev;
prev = current;
current = nextTemp;
}
*head = prev;
}
```
6. **合并有序链表**(这里是合并两个已排序链表,假设输入链表已经排序):
```c
Node* mergeSortedLists(Node* list1, Node* list2) {
if (list1 == NULL) return list2;
if (list2 == NULL) return list1;
if (list1->data < list2->data) {
list1->next = mergeSortedLists(list1->next, list2);
return list1;
} else {
list2->next = mergeSortedLists(list1, list2->next);
return list2;
}
}
```
以上就是单链表的一些基本操作的C语言实现。请注意,在实际应用中,需要考虑内存管理和错误处理。在每个函数结束时记得检查指针是否为空,防止空指针异常。同时,这只是一个基础版本,如果需要处理更复杂的情况,例如链表的头结点管理、循环链表等,还需要进一步修改和完善。
阅读全文