数据结构c语言版本中建立带头结点的单链表,试编写算法,在第i个位置前插入一个新元素,在第j个位置删除一个元素。
时间: 2024-09-09 22:06:52 浏览: 132
在C语言中,建立带头结点的单链表并进行插入和删除操作,首先需要定义链表节点的结构体,然后实现插入和删除的函数。以下是使用C语言实现这些操作的代码示例。
首先,定义链表节点和头结点的结构体:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 定义头结点结构体
typedef struct {
Node *head; // 头指针指向头结点
} LinkedList;
```
然后,初始化链表:
```c
// 初始化链表
void InitLinkedList(LinkedList *list) {
Node *head = (Node *)malloc(sizeof(Node)); // 创建头结点
head->next = NULL;
list->head = head; // 头指针指向头结点
}
```
接下来,实现插入操作:
```c
// 在第i个位置前插入一个新元素
void Insert(LinkedList *list, int i, int data) {
Node *p = list->head; // 初始化p为头结点
int j = 0; // 初始化位置计数器
// 寻找第i-1个节点
while (p && j < i - 1) {
p = p->next;
j++;
}
// 如果i小于等于1,插入到头部;如果i大于链表长度+1,则不插入
if (i <= 1) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = list->head->next;
list->head->next = newNode;
} else if (p) { // 找到了第i-1个节点
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
} else {
printf("插入位置超出链表长度,无法插入\n");
}
}
```
最后,实现删除操作:
```c
// 在第j个位置删除一个元素
void Delete(LinkedList *list, int j) {
Node *p = list->head; // 初始化p为头结点
int k = 0; // 初始化位置计数器
// 寻找第j个节点的前驱节点
while (p->next && k < j - 1) {
p = p->next;
k++;
}
// 如果第j个位置存在,则执行删除操作
if (p->next && k == j - 1) {
Node *q = p->next;
p->next = q->next;
free(q);
} else {
printf("删除位置超出链表长度,无法删除\n");
}
}
```
阅读全文