二、实验内容 编写一个程序依次实现如下功能: (1)在第i个元素之前插入一个元素e (2)删除位序为i的元素,并将删除的节点的值由变量e返回; (3)由变量e获取位序为i的元素的值; (4)输出此表; (5)退出程序时销毁此表。
时间: 2024-09-11 16:03:56 浏览: 42
QT中利用TCP协议实现了一个多线程的文件互传系统
5星 · 资源好评率100%
这个实验要求你在链表的基础上实现几个基本操作:
1. **插入元素**: 你需要编写一个方法,接收一个索引 `i` 和要插入的新值 `e`,在链表中找到第 `i` 个位置(从0开始计数),然后插入新节点。
```c
struct Node {
int data;
struct Node* next;
};
void insert(int i, int e, struct Node** head) {
// 逻辑:创建新节点,处理边界情况,遍历链表到适当位置并插入
}
```
2. **删除元素**: 找到并删除位序为 `i` 的节点,同时将被删除节点的值存储到变量 `e` 中。如果找到了该节点,用下一个节点替换它;如果没有找到,则可能需要特殊处理空指针或错误。
```c
int deleteElement(int i, struct Node** head, int* e) {
struct Node* current = *head;
struct Node* prev = NULL;
while (current != NULL && current->data != i) {
prev = current;
current = current->next;
}
if (current == NULL) {
*e = -1; // 或者抛出异常,表示未找到
return 0; // 或者直接返回不删除
} else {
if (prev == NULL) {
*head = current->next;
} else {
prev->next = current->next;
}
*e = current->data;
free(current);
return 1; // 成功删除
}
}
```
3. **获取元素**: 类似于删除,但不需要删除节点,只需读取并返回指定位置的值。
```c
int getElement(int i, struct Node* head) {
struct Node* current = head;
while (current != NULL && current->data != i) {
current = current-1; // 未找到对应元素
} else {
return current->data;
}
}
```
4. **输出链表**: 可以使用循环遍历整个链表打印每个节点的数据。
```c
void printList(struct Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
```
5. **销毁链表**: 当程序结束时,确保释放所有动态分配的内存,可以采用一个辅助函数来完成这个任务,递归地访问每个节点及其子节点。
```c
void destroyList(struct Node* head) {
if (head != NULL) {
destroyList(head->next);
free(head);
}
}
```
阅读全文