链式存储
原理: 链表存储是在程序运行过程中动态的分配空间,只要存储器还有空间,就不会发生存储溢出问题。
优点: 插入和删除速度快,保留原有的物理顺序,插入或者删除一个元素时,只需要改变指针指向即可。
缺点: 查找速度慢,每次查找都要遍历链表。
#include <stdio.h>
#include <stdlib.h>
typedef int LinkType; //数据节点存放的数据类型
typedef struct linkNode {
LinkType ele; //数据域
struct linkNode *next; //指针域
} LNode, *LinkList;
//创建链表头节点
LinkList createHeadLink(){
LinkList head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
return head;
}
//头插法
void insertFirst(LinkList head,LinkType m){
LinkList node =(LinkList)malloc(sizeof(LNode)); //创建待插入节点
node->ele=m; //值填充到数据域
node->next=head->next;//将元素插入头节点前
head->next=node;//作为新的头节点
}
//尾插法
void insertLast(LinkList head,LinkType m){
LinkList node=(LinkList)malloc(sizeof(LNode));//创建待插入节点
node->ele=m;
LinkList explorer=head;
//移到链表尾部
while(explorer->next!=NULL){
explorer=explorer->next;
}
explorer->next=node;//尾节点指向新插入的节点
node->next=NULL;//插入节点后继为空
}
//插入指定位置
void insertElem(LinkList head,int pos,LinkType m){
switch(pos){
//插入到链表尾部
case -1:
insertLast(head,m);
return;
//插入链表头部
case 0:
insertFirst(head,m);
return;
default:
LinkList node=(LinkList)malloc(sizeof(LNode));
//找到定位节点
for(int i=0;i<pos;i++){
head=head->next;
if(head->next==NULL){
printf("非法的插入位置。\n");
return;
}
}
node->ele=m;//值填充到数据域
node->next=head->next;//找到后继节点
head->next=node;//找到前驱节点
}
}
//删除指定节点
void deleteElem(LinkList head,int pos){
for(int i=0;i<pos-1;i++){//找到需要删除的节点位置
if(head->next==NULL){
printf("非法的删除位置。\n");
return;
}
head=head->next;
}
LinkList temp=head->next;//暂存需要删除的节点
head->next=temp->next;//前驱指针域指向后继节点
temp->next=NULL;//删除节点指针域置空
free(temp);//释放内存
}
void destoryList(LinkList head){
while(head->next!=NULL){
LinkList temp=head->next;
head->next=temp->next;
free(temp);//释放除头节点外所有节点
}
}
int main(int argc, char const *argv[])
{
LinkList head=createHeadLink();
insertLast(head,1);
insertLast(head,4);
insertLast(head,6);
insertLast(head,8);
insertLast(head,5);
//deleteElem(head,5);//删除第五个元素
//insertElem(head,0,2);//0位置添加元素
head=head->next;
while(head!=NULL){//遍历链表
printf("%d\n", head->ele);
head=head->next;
}
return 0;
}