用c语言在带头结点的单链表L中,将元素x插入到单链表第i个位置,注意对i值进行合法性判断
时间: 2024-01-21 20:18:59 浏览: 74
链表-使用C语言实现带头结点的单链表.zip
以下是用 C 语言实现在带头结点的单链表 L 中插入元素 x 到第 i 个位置的代码,同时对 i 进行了合法性判断:
```c
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *LinkList;
// 创建带头结点的单链表
Status CreateList(LinkList *L) {
*L = (LinkList) malloc(sizeof(Node));
if (!(*L)) {
return ERROR;
}
(*L)->next = NULL;
return OK;
}
// 获取单链表的长度
int GetLength(LinkList L) {
int len = 0;
Node *p = L->next;
while (p) {
len++;
p = p->next;
}
return len;
}
// 在第 i 个位置插入元素 x
Status Insert(LinkList L, int i, ElemType x) {
int j = 0;
Node *p = L;
// 寻找第 i-1 个结点
while (p && j < i - 1) {
p = p->next;
j++;
}
// i 值不合法或者 p 为空指针,插入失败
if (!p || j > i - 1) {
return ERROR;
}
Node *new_node = (Node *) malloc(sizeof(Node));
new_node->data = x;
new_node->next = p->next;
p->next = new_node;
return OK;
}
// 打印单链表
void PrintList(LinkList L) {
Node *p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L;
CreateList(&L);
for (int i = 1; i <= 5; i++) {
Insert(L, i, i);
}
printf("插入前的单链表:");
PrintList(L);
int pos = 3, val = 9;
if (Insert(L, pos, val)) {
printf("在第 %d 个位置插入元素 %d 成功:", pos, val);
PrintList(L);
} else {
printf("插入失败!\n");
}
return 0;
}
```
在本代码中,我们定义了 `CreateList`、`GetLength`、`Insert` 和 `PrintList` 四个函数来创建带头结点的单链表、获取单链表的长度、在第 i 个位置插入元素 x 和打印单链表。需要注意的是,插入时需要寻找第 i-1 个结点,如果 i 值不合法或者 p 为空指针,插入失败。
阅读全文