单链表(线性表的链式存储)
在内存当中不需要开辟一块连续的空间,为了让数据与数据之间建立联系,我们把每一个数据称之为结点,结点由两部分组成:数据域和指针域
数据域:保存数据
指针域:保存下一个结点的首地址
所以单链表就是由多个结点构成的
定义结点结构体
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 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 ;
}
打印链表数据,(遍历循环)
void linklistPrint(linklist *head){
while(head->next != NULL){
head = head->next;
printf("%d ", head->data);
}
putchar(10);
}
判断链表是否为空
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 ;
}
按照数据查找位置
int linklistSearchPosByData(linklist *head, datatype value){
int pos = 0;
if(linklistIsEmpty(head)){
printf("the linklist is empty\n");
return -1;
}
while(head->next != NULL){
head = head->next;
pos ++;
if(head->data == value){
return pos;
}
}
printf("the value you choosed(%d) is not exist\n",value);
return -1;
}
根据位置查找数据
datatype linklistSearchDataByPos(linklist *head, int pos){
//保存位置信息
int i = 0;
if(linklistIsEmpty(head)){
printf("the linklist is empty\n");
return (datatype)-1;
}
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){
return head->data;
}else{
printf("the pos you choosed(%d) is invalid\n", pos);
return (datatype)-1;
}
return (datatype)-1;
}
根据位置插入数据
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 ;
}
释放链表
void linklistFree(linklist *head){
linklist *temp = head->next;
while(temp != NULL){
free(head);
head = temp;
temp = temp->next;
}
free(head);
return ;
}
main.c函数部分
int main(int argc, char const *argv[]){
linklist *head = linklistCreate();
linklistHeadInsert(head, 100);
linklistHeadInsert(head, 200);
linklistHeadInsert(head, 300);
linklistHeadInsert(head, 400);
linklistHeadInsert(head, 500);
linklistPrint(head);
linklistTailInsert(head, 600);
linklistPrint(head);
printf("value deleted : %d\n", linklistDelete(head));
linklistPrint(head);
linklistModifyDataByData(head, 100, 777);
linklistPrint(head);
linklistModifyDataByPos(head, 5, 999);
linklistPrint(head);
linklistFree(head);
return 0;
}