给定一个带头结点的有序单链表,请使用 C 语言实现以下算法: (1)插入函数:把元素值为 item 的数据元素插入到表中。 (2)删除函数:删除数据元素值等于 item 的结点。 typedef int elemtype ; typedef struct Node elemtype data ; struct Node * next ; } Inode , linklist ;//单链表定义 int empty ( linklist * A );//判断链表是否为空,返回值为0则链表为空 int length ( linklist * A ); //返回单链表 A 的长度 请使用以上定义和基本操作完成如下函数定义。 int insert ( linklist * A , elemtype item);//将e插入到单链表A中,返回值为0表示插入失败 int delete ( linklist * A , elemtype item);//将单链表A中数据域为item的结点删除,返回值为0表示删除失败
时间: 2024-03-06 17:47:16 浏览: 98
C语言实现带头结点的链表的创建、查找、插入、删除操作
以下是使用 C 语言实现插入和删除函数的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct Node {
elemtype data;
struct Node *next;
} Inode, linklist;
int empty(linklist *A);
int length(linklist *A);
int insert(linklist *A, elemtype item);
int delete(linklist *A, elemtype item);
int main() {
linklist *A = (linklist *) malloc(sizeof(linklist));
A->next = NULL;
int i;
for (i = 0; i < 5; i++) {
insert(A, i);
}
printf("Length of A: %d\n", length(A)); // Length of A: 5
delete(A, 2);
printf("Length of A: %d\n", length(A)); // Length of A: 4
return 0;
}
int empty(linklist *A) {
if (A->next == NULL) {
return 0;
}
return 1;
}
int length(linklist *A) {
int len = 0;
Inode *p = A->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
int insert(linklist *A, elemtype item) {
Inode *p = A; // p指向头结点
while (p->next != NULL && p->next->data < item) {
p = p->next;
}
Inode *new_node = (Inode *) malloc(sizeof(Inode));
if (new_node == NULL) {
return 0;
}
new_node->data = item;
new_node->next = p->next;
p->next = new_node;
return 1;
}
int delete(linklist *A, elemtype item) {
Inode *p = A;
while (p->next != NULL && p->next->data != item) {
p = p->next;
}
if (p->next == NULL) {
return 0;
}
Inode *tmp = p->next;
p->next = tmp->next;
free(tmp);
return 1;
}
```
在这个实现中,我们定义了一个头结点,因此链表的实际长度应该是头结点后的结点数。函数 `empty` 判断链表是否为空,如果头结点的 `next` 指针为 `NULL` 则链表为空。函数 `length` 返回链表的长度,遍历链表并计数即可。函数 `insert` 将元素插入到有序链表中,首先找到元素应该插入的位置,然后创建一个新的结点并插入到链表中。函数 `delete` 删除链表中指定元素的结点,首先找到该结点所在的位置,然后将该结点删除并释放内存。
阅读全文