对刚建立的顺序表实现插入、删除、查找,并将结果在屏幕上输出。 3. 用头插法或尾插法建立带头结点的单链表,并在屏幕上输出显示此链表。 4. 实现单链表上的插入、删除、修改、查找、计数等操作,并输出。
时间: 2023-12-21 07:03:24 浏览: 73
好的,我可以给你讲解一下这些数据结构的实现过程。
1. 顺序表的插入、删除、查找操作
首先,我们需要定义一个结构体来表示顺序表:
```c
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE]; // 存储数据的数组
int length; // 当前顺序表中元素的个数
} SqList;
```
在顺序表中插入一个元素可以分为以下几个步骤:
1. 判断顺序表是否已满,如果已满则无法插入;
2. 在指定位置插入新元素;
3. 将插入位置后面的元素向后移动一个位置;
4. 将顺序表的长度加一。
具体实现代码如下:
```c
bool insert(SqList *L, int index, int value) {
if (L->length == MAXSIZE) {
return false; // 顺序表已满,无法插入
}
if (index < 1 || index > L->length + 1) {
return false; // 插入位置不合法
}
for (int i = L->length; i >= index; i--) {
L->data[i] = L->data[i - 1]; // 将插入位置后面的元素向后移动一个位置
}
L->data[index - 1] = value; // 在指定位置插入新元素
L->length++; // 将顺序表的长度加一
return true;
}
```
在顺序表中删除一个元素可以分为以下几个步骤:
1. 判断待删除元素的位置是否合法,如果不合法则无法删除;
2. 将待删除元素后面的元素向前移动一个位置;
3. 将顺序表的长度减一。
具体实现代码如下:
```c
bool remove(SqList *L, int index) {
if (index < 1 || index > L->length) {
return false; // 待删除元素的位置不合法
}
for (int i = index; i < L->length; i++) {
L->data[i - 1] = L->data[i]; // 将待删除元素后面的元素向前移动一个位置
}
L->length--; // 将顺序表的长度减一
return true;
}
```
在顺序表中查找一个元素可以使用循环进行遍历,如果找到了该元素则返回其下标,如果未找到则返回 -1。
具体实现代码如下:
```c
int find(SqList *L, int value) {
for (int i = 0; i < L->length; i++) {
if (L->data[i] == value) {
return i; // 找到了该元素,返回其下标
}
}
return -1; // 未找到该元素
}
```
2. 带头结点的单链表的建立和输出
在建立带头结点的单链表时,我们需要定义一个链表结构体:
```c
typedef struct Node {
int data; // 存储数据的变量
struct Node *next; // 指向下一个节点的指针
} ListNode, *LinkedList;
```
链表的建立可以使用头插法或尾插法。这里我们以头插法为例:
```c
LinkedList createList(int n) {
LinkedList head = (LinkedList) malloc(sizeof(ListNode)); // 创建头结点
head->next = NULL; // 头结点的 next 指针初始化为 NULL
for (int i = 0; i < n; i++) {
int value;
printf("请输入第 %d 个节点的值:", i + 1);
scanf("%d", &value);
ListNode *node = (ListNode *) malloc(sizeof(ListNode)); // 创建新节点
node->data = value; // 设置新节点的数据
node->next = head->next; // 将新节点插入到头结点的后面
head->next = node;
}
return head;
}
```
链表的输出可以使用循环进行遍历,依次输出每个节点的值:
```c
void printList(LinkedList head) {
ListNode *p = head->next; // 从第一个节点开始遍历
while (p != NULL) { // 如果当前节点不为空,则输出当前节点的值
printf("%d ", p->data);
p = p->next; // 将指针指向下一个节点
}
printf("\n");
}
```
3. 单链表的插入、删除、修改、查找、计数等操作
在单链表上插入一个元素可以分为以下几个步骤:
1. 判断插入位置是否合法,如果不合法则无法插入;
2. 创建新节点,并设置新节点的数据;
3. 将新节点插入到指定位置的后面;
4. 将链表的长度加一。
具体实现代码如下:
```c
bool insert(LinkedList head, int index, int value) {
ListNode *p = head;
for (int i = 0; i < index - 1 && p != NULL; i++) {
p = p->next; // 将指针指向插入位置的前一个节点
}
if (p == NULL) {
return false; // 插入位置不合法
}
ListNode *node = (ListNode *) malloc(sizeof(ListNode)); // 创建新节点
node->data = value; // 设置新节点的数据
node->next = p->next; // 将新节点插入到指定位置的后面
p->next = node;
return true;
}
```
在单链表上删除一个元素可以分为以下几个步骤:
1. 判断待删除元素的位置是否合法,如果不合法则无法删除;
2. 将待删除元素的前一个节点指针指向待删除元素的后一个节点;
3. 释放待删除元素的内存空间。
具体实现代码如下:
```c
bool remove(LinkedList head, int index) {
ListNode *p = head;
for (int i = 0; i < index - 1 && p != NULL; i++) {
p = p->next; // 将指针指向待删除元素的前一个节点
}
if (p == NULL || p->next == NULL) {
return false; // 待删除元素的位置不合法
}
ListNode *node = p->next; // 将待删除元素保存到临时变量中
p->next = node->next; // 将待删除元素的前一个节点指针指向待删除元素的后一个节点
free(node); // 释放待删除元素的内存空间
return true;
}
```
在单链表上修改一个元素可以分为以下几个步骤:
1. 判断待修改元素的位置是否合法,如果不合法则无法修改;
2. 将待修改元素的数据修改为指定的新值。
具体实现代码如下:
```c
bool update(LinkedList head, int index, int value) {
ListNode *p = head->next;
for (int i = 1; i < index && p != NULL; i++) {
p = p->next; // 将指针指向待修改元素的节点
}
if (p == NULL) {
return false; // 待修改元素的位置不合法
}
p->data = value; // 将待修改元素的数据修改为指定的新值
return true;
}
```
在单链表上查找一个元素可以使用循环进行遍历,如果找到了该元素则返回其值,如果未找到则返回 -1。
具体实现代码如下:
```c
int find(LinkedList head, int value) {
ListNode *p = head->next; // 从第一个节点开始遍历
int index = 1; // 记录当前节点的下标
while (p != NULL) { // 如果当前节点不为空,则判断当前节点的值是否等于要查找的值
if (p->data == value) {
return index; // 找到了该元素,返回其下标
}
p = p->next; // 将指针指向下一个节点
index++;
}
return -1; // 未找到该元素
}
```
在单链表上计算元素个数可以使用循环进行遍历,遍历过程中将计数器加一即可。
具体实现代码如下:
```c
int count(LinkedList head) {
int count = 0;
ListNode *p = head->next; // 从第一个节点开始遍历
while (p != NULL) { // 如果当前节点不为空,则将计数器加一
count++;
p = p->next; // 将指针指向下一个节点
}
return count;
}
```
阅读全文