一、概念
單鏈表是一種鏈式存儲的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) +指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
二、代碼
1、頭文件
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
2、聲明
//聲明結點
typedef struct Listnode
{
int data;
Listnode*next;
};
//聲明鏈表
typedef struct List
{
Listnode head;
int size;
};
3、函數代碼
//初始化
List* initlist()
{
List* list=(List*)malloc(sizeof(List)) ;//鏈表
list->head.next=NULL;
list->size=0;
return list;
}
//插入操作
void Zinsert(List* list,int pos,int data)
{
//判斷
if(pos<0||pos>list->size)
{
pos=list->size; //優化處理
}
if(list==NULL||data==NULL)
{
return;
}
//新建結點
Listnode*newnode=(Listnode*)malloc(sizeof(Listnode));
newnode->data=data;
newnode->next=NULL;
Listnode*pcur=&(list->head);
//插入新結點
for(int i=0;i<pos;i++) //得到pos前一個結點
{
pcur=pcur->next;
}
newnode->next=pcur->next;
pcur->next=newnode;
//長度加一
list->size++;
}
//刪除操作
void valuedelete(List* list,int data)
{
//判斷
if(list==NULL||data==NULL)
{
return;
}
//刪除
Listnode* pcur=&(list->head);
Listnode* flag=pcur->next;
while(pcur!=NULL)
{
if(flag->data==data)
{
pcur->next=flag->next;
}
pcur=pcur->next;
flag=flag->next;
}
list->size--;
}
//單鏈表的排序 從大到小
void listSort(List* list)
{
//判斷
if(list==NULL)
{
return;
}
//冒泡排序
Listnode* pcur1;
Listnode* pcur2;
for(pcur1=list->head.next;pcur1!=NULL;pcur1=pcur1->next)
{
for(pcur2=list->head.next;pcur2!=NULL;pcur2=pcur2->next)
{
if(pcur1->data > pcur2->data)
{
int temp;
temp=pcur1->data;
pcur1->data=pcur2->data;
pcur2->data=temp;
}
}
}
}
//單鏈表逆置
void back(List* list)
{
//判斷
if(list==NULL)
{
return;
}
//逆置
Listnode* pcur1=list->head.next;
Listnode* pcur2=NULL;
while(pcur1!=NULL)
{
Listnode* temp;
temp=pcur1;
pcur1=pcur1->next;
temp->next=pcur2;
pcur2=temp;
list->head.next=pcur2;
}
}
//打印
void myprint(List* list)
{
if(list==NULL)
{
return;
}
Listnode*pcur=list->head.next;
while(pcur!=NULL)
{
printf("%d",pcur->data);
pcur=pcur->next;
}
}
//釋放鏈表內存
void freespace(List* list)
{
if(list==NULL)
{
return;
}
free(list);
}
4、主函數
int main()
{
List*list=initlist();
//插入
Zinsert(list,10,1);
Zinsert(list,10,2);
Zinsert(list,10,3);
//打印
myprint(list);
//換行
printf("\n");
//逆置
back(list);
myprint(list);
printf("\n");
//刪除
valuedelete(list,2);
//打印
myprint(list);
//釋放內存
free(list);
}
四、運行結果