链表存储是在程序运行过程中动态分配空间,只要存储空间还有空间,就不会发生存储溢出问题 。
优点:插入和删除速度快,保有原有的物理顺序。比如,插入或者删除一个元素时,只需要改变指针指向即可。缺点:查找速度慢,因为查找时,需要循环链表访问 。
#include<stdio.h>
#include<stdlib.h>
//链表,别名链式存储结构或单链表
//链表不限制数据的物理存储状态,使用链表存储的数据其物理存储位置是随机的
//链表的节点:数据域和指针域,链表实际存储的是一个一个的节点
//创建一个存储 {1,2,3,4} 链表
//链表的初始化:声明一个头指针,创建节点
//定义节点
//typedef给结构体等类型定义别名
typedef struct Link{
int elem;
struct Link * next;
}link; //link是Link的别名;可以用别名来声明数据类型
//初始节点
link * init_link(){
//创建头结点
link * p = NULL; //创建指向头结点的指针
link * temp = (link*)malloc(sizeof(link)); // 创建头节点
//头结点初始化
p = temp;
//从第一个节点开始创建
for(int i=1; i<5; i++){
link * a = (link*)malloc(sizeof(link)); //动态分配存储空间
a->elem = i;
a->next = NULL;
temp->next = a;
//更新temp
temp = temp->next;
}
//返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
return p;
}
void dispaly_elem(link *p){
link * temp = p;
// temp = temp->next;
// while(temp){
// printf("%d\n",temp->elem);
// temp = temp->next;
// }
while(temp->next){
temp = temp->next;
printf("%d\n",temp->elem);
}
// printf("%d\n",p);
// printf("%d\n",&p);
}
// 链表的基本操作增、删、改、查;
link * insertElem(link *p, int elem, int pos) //pos指的是在第几个节点后插入
{
link *temp = p;
//找到要插入位置的上一个节点
for(int i=0; i<pos; i++){
temp = temp->next;
}
//初始化新插入的结点
link *c = (link*)malloc(sizeof(link));
//先对新插入的结点与后继结点进行连接,再将插入的结点与前驱结点相连
c->next = temp->next;
temp->next = c;
c->elem = elem;
return p;
}
//删除指定位置的结点
link * deleteElem(link *p, int pos){
//pos指的是要删除元素的位置
link * temp = p;
//找要删除结点的前一个结点
for (int i=0; i<pos-1; i++){
temp=temp->next;
}
link * a=temp->next;
temp->next=temp->next->next;
a->next = NULL;
free(a);
return p;
}
//查找指定元素,并返回元素的位置
int searchElem(link *p, int elem)
{
//elem指的是要查找的元素
link * temp = p->next;
//初始pos,pos是要返回元素的位置
int pos = 1;
//查找结点的位置
while(temp){
if(temp->elem == elem){
break;
}
temp=temp->next;
pos++;
}
return pos;
}
//更新指定位置结点的元素
//....
int main(){
link *p = init_link();
printf("%d\n",p);
printf("\n");
// printf("%d\n",&p);
dispaly_elem(p);
//在第二个元素之后插入新结点
p=insertElem(p,24,2);
printf("在第二个元素之后插入新结点\n");
printf("%d\n",p);
dispaly_elem(p);
//删除第二个元素
p=deleteElem(p,2);
printf("删除第二个元素\n");
printf("%d\n",p);
dispaly_elem(p);
//查找值为24的元素的位置
int posi=searchElem(p,24);
printf("查找值为24的元素的位置\n");
printf("%d\n",posi);
}