c语言中顺序表,线性表,循环链表,双向链表的实现,代码
时间: 2024-10-07 09:04:44 浏览: 37
C语言实现存放任意数据类型的线性表和链表
在C语言中,数据结构主要包括顺序表、线性表、循环链表和双向链表。
1. **顺序表(Array)**:
- 它是一种简单的线性表,使用数组作为存储结构,元素按顺序排列。
- 实现时,我们可以创建一个动态数组,例如:
```c
#include <stdio.h>
typedef struct {
int* data; // 存储元素
int size; // 当前元素个数
int max_size; // 最大容量
} SeqList;
void init(SeqList* list, int capacity) {
list->data = (int*)malloc(capacity * sizeof(int));
list->size = 0;
list->max_size = capacity;
}
// 添加元素到末尾
void append(SeqList* list, int value) {
if (list->size == list->max_size)
expand_list(list);
list->data[list->size++] = value;
}
// 扩展列表容量
void expand_list(SeqList* list) {
list->max_size *= 2;
list->data = (int*)realloc(list->data, list->max_size * sizeof(int));
}
```
2. **线性链表(Linear List)**:
- 使用节点(Node)表示元素,每个节点包含值和指向下一个节点的指针。
- 没有固定的存储空间,比如单向链表的实现:
```c
typedef struct Node {
int value;
struct Node* next;
} LinkList;
// 创建新节点并添加到链表尾部
void insert(LinkList** head, int value) {
LinkList* newNode = (LinkList*)malloc(sizeof(LinkList));
newNode->value = value;
newNode->next = NULL;
if (*head == NULL)
*head = newNode;
else
while ((*head)->next != NULL)
head = &(*head)->next;
(*head)->next = newNode;
}
```
3. **循环链表(Circular Linked List)**:
- 和普通链表类似,但在最后一个节点之后还有一个指针指向第一个节点,形成环形结构。
```c
typedef struct Node {
int value;
struct Node* next;
} CycList;
// ...(类似插入操作,需要修改指针连接)
void circular_insert(CycList** head, int value) {
...
(*head)->next = *head;
}
```
4. **双向链表(Double-Linked List)**:
- 结构与循环链表相似,除了每个节点有两个指针,分别指向前一个节点和后一个节点。
```c
typedef struct Node {
int value;
struct Node* prev;
struct Node* next;
} DoublyLinkedList;
// 插入节点示例
void insert(DoublyLinkedList** head, int value) {
DoublyLinkedList* newNode = (DoublyLinkedList*)malloc(sizeof(DoublyLinkedList));
newNode->value = value;
newNode->prev = NULL;
newNode->next = *head;
if (*head != NULL)
(*head)->prev = newNode;
if (*head == NULL)
*head = newNode;
else
(*head)->next->prev = newNode;
}
```
阅读全文