顺序表(C)
1.顺序表的概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和删除元素时,可能需要移动大量元素,效率相对较低。
2. 实现顺序表操作
#ifndef TEST_H
#define TEST_H
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int length;
} SeqList;
void initList(SeqList *list);
void insertAtTail(SeqList *list, int value);
void traverseList(SeqList *list);
void deleteAtTail(SeqList *list);
void insertAtPosition(SeqList *list, int position, int value);
void deleteAtPosition(SeqList *list, int position);
void updateAtPosition(SeqList *list, int position, int value);
int findAtPosition(SeqList *list, int position);
void deleteByValue(SeqList *list, int value);
void updateByValue(SeqList *list, int oldValue, int newValue);
int findByValue(SeqList *list, int value);
void removeDuplicates(SeqList *list);
void bubbleSort(SeqList *list);
#endif // TEST_H
#include "test.h"
#include <stdio.h>
void initList(SeqList *list) {
list->length = 0;
}
void insertAtTail(SeqList *list, int value) {
if (list->length >= MAX_SIZE) {
printf("List is full!\n");
return;
}
list->data[list->length++] = value;
}
void traverseList(SeqList *list) {
for (int i = 0; i < list->length; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
void deleteAtTail(SeqList *list) {
if (list->length == 0) {
printf("List is empty!\n");
return;
}
list->length--;
}
void insertAtPosition(SeqList *list, int position, int value) {
if (list->length >= MAX_SIZE) {
printf("List is full!\n");
return;
}
if (position < 0 || position > list->length) {
printf("Invalid position!\n");
return;
}
for (int i = list->length; i > position; i--) {
list->data[i] = list->data[i - 1];
}
list->data[position] = value;
list->length++;
}
void deleteAtPosition(SeqList *list, int position) {
if (list->length == 0) {
printf("List is empty!\n");
return;
}
if (position < 0 || position >= list->length) {
printf("Invalid position!\n");
return;
}
for (int i = position; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
}
void updateAtPosition(SeqList *list, int position, int value) {
if (position < 0 || position >= list->length) {
printf("Invalid position!\n");
return;
}
list->data[position] = value;
}
int findAtPosition(SeqList *list, int position) {
if (position < 0 || position >= list->length) {
printf("Invalid position!\n");
return -1;
}
return list->data[position];
}
void deleteByValue(SeqList *list, int value) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == value) {
for (int j = i; j < list->length - 1; j++) {
list->data[j] = list->data[j + 1];
}
list->length--;
i--; // Re-check the current position after deletion
}
}
printf("Value not found!\n");
}
void updateByValue(SeqList *list, int oldValue, int newValue) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == oldValue) {
list->data[i] = newValue;
return;
}
}
printf("Value not found!\n");
}
int findByValue(SeqList *list, int value) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == value) {
return i;
}
}
printf("Value not found!\n");
return -1;
}
void removeDuplicates(SeqList *list) {
for (int i = 0; i < list->length; i++) {
for (int j = i + 1; j < list->length; j++) {
if (list->data[i] == list->data[j]) {
for (int k = j; k < list->length - 1; k++) {
list->data[k] = list->data[k + 1];
}
list->length--;
j--; // Re-check the current position after deletion
}
}
}
}
void bubbleSort(SeqList *list) {
for (int i = 0; i < list->length - 1; i++) {
for (int j = 0; j < list->length - i - 1; j++) {
if (list->data[j] > list->data[j + 1]) {
int temp = list->data[j];
list->data[j] = list->data[j + 1];
list->data[j + 1] = temp;
}
}
}
}
#include "test.h"
int main() {
SeqList list;
initList(&list);
insertAtTail(&list, 3);
insertAtTail(&list, 1);
insertAtTail(&list, 4);
insertAtTail(&list, 1);
insertAtTail(&list, 5);
printf("Original list: ");
traverseList(&list);
insertAtPosition(&list, 2, 2);
printf("After inserting 2 at position 2: ");
traverseList(&list);
deleteAtPosition(&list, 1);
printf("After deleting at position 1: ");
traverseList(&list);
updateAtPosition(&list, 2, 6);
printf("After updating position 2 to 6: ");
traverseList(&list);
int value = findAtPosition(&list, 2);
printf("Value at position 2: %d\n", value);
deleteByValue(&list, 4);
printf("After deleting value 4: ");
traverseList(&list);
updateByValue(&list, 6, 7);
printf("After updating value 6 to 7: ");
traverseList(&list);
int pos = findByValue(&list, 7);
printf("Position of value 7: %d\n", pos);
removeDuplicates(&list);
printf("After removing duplicates: ");
traverseList(&list);
bubbleSort(&list);
printf("After sorting: ");
traverseList(&list);
return 0;
}