单链表
线性表:
- 有限的序列
- 序列中的每一个元素都有唯一的前驱和后继,除了开头和结尾两个节点
顺序表:分配一块连续的内存去存放这些元素
链表:内存是不连续的,元素会各自被分配一块内存,内存和内存之间用指针进行相连
单链表操作:
- 增加
- 头插法
- 尾插法
- 删除
- 删除节点 先将节点拿出,先前节点指向被拿出节点的下一节点,再将拿出节点进行释放(个人理解)
- 只需要找到对应节点,将对应节点的前一个节点指向这个节点的后继,之操作一个指针
头插法
尾插法
头节点
- 在链表前插入一个头节点,保存链表的个数,一般的第一个元素是从头节点的next开始计数
代码复现
#include <stdio.h>
#include <stlib.h>
typedef struct Node {
int data;
struct Node* next;
}Node;
Node* initList(){
Node* list=(Node*)malloc(sizeof(Node));
list->data=0;//list指向结构体的指针
list->next=NULL;
return list;
}
void headInsert(Node* list,int data){
Node* node =(Node*)malloc(sizeof(Node));
node->data=data;
node->next=list->next;
list->next=node;
list->data++;
}
void tailInsert(Node* list,int data){
Node* head=list;//保存头节点地址
Node* node=(Node*)malloc(sizeof(Node));
node->data=data;
node->next=NULL;
list=list->next;
while(list->next){//跳出循环的条件是list指向链表的最后一个节点
list=list->next;
}
list->next=node;//连接新节点
head->data++;
}
void delete(Node* list,int data){
Node* pre=list;//删除节点的前一个节点
Node* current=list->next;//需要删除的节点
list=list->next;
while(current){//不是要删除的节点跳出循环
if(current->data==data){//如果要删除的节点数据等于链表中的数据
pre->next=current->next;//删除节点的前一个节点的下一条连接当前删除节点的下一条
free(current);
break;
}
pre=current;//current值得是删除完节点后的当前节点
current=current->next;
}
list->data--;
}
void printList(*Node list){
list=list->next;
while(list){
printf("%d",list->data);
list=list->next;
}
printf("\n")
}
int main(){
Node* list=initlist();
headInsert(list,1);
headInsert(list,2);
headInsert(list,3);
headInsert(list,4);
headInsert(list,5);
tailInsert(list,6);
tailInsert(list,7);
tailInsert(list,8);
tailInsert(list,9);
tailInsert(list,10);
printList(list);
//delete(list,5);
//delete(list,10);
//delete(list,6);
return 0;
}