设计一个算法,使用C语言实现:使用结构体和数组存储线性表结构,实现线性表的以下操作:初始化、求长度、添加新节点、输出所有节点、任意位置插入新节点、删除指定位置节点、按序号查找节点、按输入关键字查找序号
时间: 2024-09-15 21:01:47 浏览: 66
在C语言中,线性表可以通过数组和结构体来实现。下面是一个简单的实现方法:
首先,定义一个结构体`ListNode`来表示线性表中的节点,然后定义一个结构体`List`来表示整个线性表,其中包含一个`ListNode`数组用于存储节点,以及一个整型变量用于记录线性表的长度。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 定义线性表的最大长度
// 线性表节点的结构体定义
typedef struct {
int data; // 存储数据
} ListNode;
// 线性表的结构体定义
typedef struct {
ListNode nodes[MAX_SIZE]; // 存储节点的数组
int length; // 线性表当前长度
} List;
// 初始化线性表
void InitList(List *list) {
list->length = 0;
}
// 求线性表的长度
int ListLength(List *list) {
return list->length;
}
// 在线性表的尾部添加新节点
void AddNode(List *list, int data) {
if (list->length >= MAX_SIZE) {
printf("线性表已满,无法添加新节点。\n");
return;
}
list->nodes[list->length].data = data;
list->length++;
}
// 输出所有节点
void PrintList(List *list) {
for (int i = 0; i < list->length; i++) {
printf("%d ", list->nodes[i].data);
}
printf("\n");
}
// 在线性表的指定位置插入新节点
void InsertNode(List *list, int index, int data) {
if (index < 0 || index > list->length || list->length >= MAX_SIZE) {
printf("插入位置不合法或线性表已满。\n");
return;
}
for (int i = list->length; i > index; i--) {
list->nodes[i] = list->nodes[i - 1];
}
list->nodes[index].data = data;
list->length++;
}
// 删除线性表的指定位置节点
void DeleteNode(List *list, int index) {
if (index < 0 || index >= list->length) {
printf("删除位置不合法。\n");
return;
}
for (int i = index; i < list->length - 1; i++) {
list->nodes[i] = list->nodes[i + 1];
}
list->length--;
}
// 按序号查找节点
ListNode* GetNodeByIndex(List *list, int index) {
if (index < 0 || index >= list->length) {
printf("查找位置不合法。\n");
return NULL;
}
return &list->nodes[index];
}
// 按输入关键字查找序号
int FindNodeByValue(List *list, int value) {
for (int i = 0; i < list->length; i++) {
if (list->nodes[i].data == value) {
return i;
}
}
return -1; // 如果找不到,返回-1
}
int main() {
List myList;
InitList(&myList);
AddNode(&myList, 10);
AddNode(&myList, 20);
AddNode(&myList, 30);
InsertNode(&myList, 1, 25); // 在索引为1的位置插入25
DeleteNode(&myList, 2); // 删除索引为2的节点
PrintList(&myList); // 输出线性表
ListNode *node = GetNodeByIndex(&myList, 1); // 获取索引为1的节点
if (node) {
printf("节点值为:%d\n", node->data);
}
int index = FindNodeByValue(&myList, 25); // 查找值为25的节点序号
if (index != -1) {
printf("找到值为25的节点,其序号为:%d\n", index);
}
return 0;
}
```
这个例子提供了线性表的基本操作。你可以根据需要扩展或修改这些操作。下面提出相关问题:
阅读全文