线性表
- 有限的序列
- 序列中的每一个元素都有前驱和后继,除了开头和结尾两个节点
顺序表
分配一块连续的内存去存放这些元素,例如数组
链表
内存是不连续的,元素会各自被分配一块内存,内存和内存之间用!指针相连
单链表
单链表操作
初始化
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;//创建链表
Node *initList() {
Node *list = (Node *)malloc(sizeof(Node));
list -> data = 0;
list -> next = NULL;
return list;
}//链表的初始化
int main()
{
Node *list = initList();
return 0;
}
增加
一、头插法
- 带头结点:
- 不带头结点:
为方便后期做题,统一带头节点
void headInsert (Node* list, int data) {
Node* p = (Node *)malloc(sizeof(Node));
p -> data = data;
p -> next = list -> next;
list -> next = p;
list -> data++;//此处头节点记录节点的数量
}
二、尾插法
void tailInsert (Node* list, int data) {
Node* p = (Node *)malloc(sizeof(Node));
p -> data = data;
p -> next = NULL;
while (list -> next != NULL) {
list = list -> next;
}
list -> next = p;
head -> data++;
}
删除
只需要找到要删除的节点的前驱节点,将前驱节点的next指向要删除节点的next即可
void deleteNode (Node* list, int data) {
Node* pre = list;
Node* current = list -> next;
while (current) //与(current != NULL)含义相同
{
if (current -> data == data) {
pre -> next = current -> next;
free(current);
//current = NULL;可有可无
break;
}
pre = current;
current = current -> next;
}
list -> data--;
}//删除指定数据的节点
遍历
void printList (Node* list) {
list = list -> next;//指向第一个节点
while (list) {
printf("%d ", list -> data);
list = list -> next;
}
printf("\n");
}