目录
相关概念
单链表:线性表的链式存储 ,单链表中的每一个数据称为结点,结点由数据域和指针域组成——数据域(保存数据)和指针域(指向下一个结点)。
相关操作
定义结点结构体
typedef struct node{
datatype data;
struct node *next;
}linklist;
创建空的单链表
linklist* linklistCreate(){
linklist *head = (linklist *)malloc(sizeof(linklist));
head->next = NULL;
return head;
}
头插法插入数据
void linklistHeadInsert(linklist *head, datatype value){
//创建一个temp结点,用于存储数据
linklist* temp = (linklist *)malloc(sizeof(linklist));
//存储alue到temp结点的数据域
temp->data = value;
//初始化temp结点的指针域
temp->next = NULL;
//头插法两步走
//1.先用temp结点保存head指向的结点
temp->next = head->next;
//2.将head指向temp结点
head->next = temp;
return ;
}
遍历链表,打印数据
void linklistPrint(linklist *head){
while(head->next != NULL){
head = head->next;
printf("%d ", head->data);
}
putchar(10);
}
尾插法插入数据
void linklistTailInsert(linklist *head, datatype value){
linklist *temp = (linklist *)malloc(sizeof(linklist));
temp->data = value;
temp->next = NULL;
//尾插法两步走
//1.遍历到链表最末端
while(head->next != NULL){
head = head->next;
}
//2.将temp结点直接接入到head之后
head->next = temp;
temp->next = NULL;
return ;
}
判断链表是否为空
bool linklistIsEmpty(linklist *head){
return head->next == NULL ? true : false;
}
头删法删除数据,并返回数据
datatype linklistDelete(linklist *head){
//判断链表是否为空,若是则退出函数
if(linklistIsEmpty(head)){
printf("the linklist is empty\n");
return (datatype)-1;
}
//先存储数据,用于返回数据
datatype value = head->next->data;
//用于临时保存head的下一个结点(将要被删除),用于内存的释放
linklist *temp = head->next;
//删除结点
head->next = head->next->next;
free(temp);
return value;
}
根据数据修改数据
void linklistModifyDataByData(linklist *head, datatype oldValue, datatype newValue){
if(linklistIsEmpty(head)){
printf("the linklist is empty\n");
return ;
}
while(head->next != NULL){
head = head->next;
if(head->data == oldValue){
head->data = newValue;
return ;
}
}
printf("the data you choosed is not exit\n");
return ;
}
根据位置修改数据
void linklistModifyDataByPos(linklist *head, int pos, datatype value){
//保存位置信息
int i = 0;
if(linklistIsEmpty(head)){
printf("the linklist is empty\n");
return ;
}
if(pos < 1){
printf("the pos you choosed(%d) is invalid\n", pos);
}
while(head->next != NULL && i < pos){
head = head->next;
i++;
}
if(i == pos){
head->data = value;
}else{
printf("the pos you choosed(%d) is invalid\n", pos);
return ;
}
return ;
}
根据位置插入数据
void linklistInsertDataByPos(linklist *head, int pos, datatype value){
int i = 1;
linklist *temp = (linklist *)malloc(sizeof(linklist));
temp->data = value;
temp->next = NULL;
if(pos < 1){
printf("the pos you choosed(%d) is invalid\n", pos);
free(temp);
return ;
}
while(head->next != NULL && i < pos){
head = head->next;
i++;
}
if(i == pos){
temp->next = head->next;
head->next = temp;
}else{
printf("the pos you choosed(%d) is invalid\n", pos);
return (datatype)-1;
}
return ;
}