使用C语言完成以下内容定义线性表的顺序和链式存储结构编程完成顺序表和单链表的创建、插入、删除、查找和输出操作。
时间: 2024-10-21 10:01:56 浏览: 23
关于线性表的顺序存储和链式存储结构的实验报告
在C语言中,我们可以使用数组来实现顺序表(数组表示法),而使用链表来实现单链表(节点链接表示法)。以下是基本操作的简单实现:
### 顺序表(动态数组)
```c
#include <stdio.h>
typedef struct {
int *data; // 存储元素的指针
int size; // 数组长度
int capacity; // 容量上限
} SeqList;
// 初始化顺序表
SeqList* init_seq_list(int cap) {
SeqList* list = (SeqList*)malloc(sizeof(SeqList));
list->data = malloc(cap * sizeof(int));
list->size = 0;
list->capacity = cap;
return list;
}
// 插入元素
void insert_seq_list(SeqList* list, int value) {
if (list->size == list->capacity) {
list->capacity *= 2;
list->data = realloc(list->data, list->capacity * sizeof(int)); // 扩容
}
list->data[list->size++] = value;
}
// 删除元素
int remove_seq_list(SeqList* list, int index) {
if (index >= 0 && index < list->size) {
int removed_value = list->data[index];
for (int i = index; i < list->size - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->size--;
if (list->size == 0) {
free(list->data);
list->data = NULL;
} else {
list->data = realloc(list->data, list->size * sizeof(int));
}
return removed_value;
}
return -1; // 如果索引错误,返回错误值
}
// 查找元素
int search_seq_list(SeqList* list, int value) {
for (int i = 0; i < list->size; i++) {
if (list->data[i] == value) {
return i;
}
}
return -1; // 没找到则返回-1
}
// 输出序列
void print_seq_list(SeqList* list) {
printf("Sequence: ");
for (int i = 0; i < list->size; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
```
### 单链表
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} LinkNode;
// 初始化链表
LinkNode* init_link_list() {
return NULL;
}
// 在链表末尾插入元素
void insert_link_list(LinkNode** head, int value) {
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = value;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
LinkNode* last = *head;
while (last->next != NULL) {
last = last->next;
}
last->next = newNode;
}
}
// 删除元素
void remove_link_list(LinkNode** head, int value) {
if (*head == NULL) {
return;
}
LinkNode* curr = *head;
if (curr->data == value) {
*head = curr->next;
free(curr);
return;
}
while (curr->next != NULL && curr->next->data != value) {
curr = curr->next;
}
if (curr->next != NULL) {
curr->next = curr->next->next;
free(curr->next); // 释放不再需要的节点
}
}
// 查找元素
LinkNode* find_link_list(LinkNode* head, int value) {
LinkNode* curr = head;
while (curr != NULL) {
if (curr->data == value) {
return curr;
}
curr = curr->next;
}
return NULL; // 没找到返回NULL
}
// 输出链表
void print_link_list(LinkNode* head) {
LinkNode* temp = head;
while (temp != NULL) {
printf("%d ->", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
```
阅读全文