啦啦啦,我又来了,我带着《数据结构与算法》愉快地走来了(那是相当的愉快,不信你瞧,我头上仅剩的发丝正欢呼雀跃地漫天纷飞,哭!)。数据结构与算法作为编程的核心内容,其重要性不言而喻,不论你将来是要考研进修还是进大厂面试,他都会默默的陪伴你,不离不弃。为了自己的未来,我发誓我要好好学习数据结构,要用自己的满腔热血感化它,嗯,给自己的勇气加油!
本篇是自己对数据结构中基础中的基础——单链表的总结,如有不足之处,希望各位大佬指点一二(徒手画图,有点难看,轻喷点哦,嘻嘻)。
1.函数声明与定义:
#include<stdio.h> #include<stdlib.h> typedef struct node //定义结构体,每个节点有一个数据域和指针域
{
int date;
struct node * next;
}node,*pnode;
void initlink(pnode *L); //初始化链表,即创建头结点
void createlink(pnode L); //创建链表
void traverselink(pnode L); //遍历链表
pnode search(pnode L,int i,pnode *per); //查找链表中第i个节点,并返回此节点的地址
void insertlink(pnode L); //在链表第i个节点上插入新节点
void deleteelement(pnode L); //删除第i个节点
pnode searchs(pnode L,int val,pnode *per); //在链表中查找元素val,并返回元素val所在的节点p的地址,及此节点前一节点per的地址
void insertslink(pnode L); //在元素val节点插入新节点
void deleteselement(pnode L); //删除特定元素
2.链表的初始化:
void initlink(pnode *L)//初始化链表,即创建头结点
{
*L=(pnode)malloc(sizeof(node)); if(!*L)
{
printf("内存分配失败!\n");
exit(-1);
}
(*L)->next=NULL;
return;
}
3.创建链表:
void createlink(pnode L)//创建链表
{
int len,i;
pnode p,q;
printf("请输入链表长度:\n");
scanf("%d",&len);
p=L;
for(i=0;i<len;i++)
{
q=(pnode)malloc(sizeof(node)); if(!q)
{
printf("内存分配失败!\n");
exit(-1);
}
printf("请输入元素:\n");
scanf("%d",&q->date);
q->next=p->next;
p->next=q;
p=q;
}
putchar(10);
return;
}
4.遍历链表:
void traverselink(pnode L)//遍历链表
{
pnode h;
h=L->next; while(h)
{
printf("%d\n",h->date);
h=h->next;
}
putchar(10);
return;
}
5.在链表中指定位置进行增、删操作:
pnode search(pnode L,int i,pnode *per)//查找链表中第i个节点,并返回此节点的地址
{
pnode p;
int k=0;
p=L; while(p!=NULL && k<i)
{
*per=p;
k++;
p=p->next;
}
if(k<i) *per=NULL;
return p;
}
void insertlink(pnode L)//在链表第i个节点上插入一个新节点
{
int i,val;
pnode h,k,per;
h=(pnode)malloc(sizeof(node)); if(!h)
{
printf("内存分配失败!\n");
exit(-1);
}
printf("请输入要插入元素的位置i,及所插入的元素val:\n");
scanf("%d %d",&i,&val);
h->date=val;
k=search(L,i,&per); if(!per)
{
printf("i值有误\n");
exit(-1);
}
h->next=k;
per->next=h;
putchar(10);
return;
}
void deleteelement(pnode L)//删除第i个节点
{
pnode h,per;
int i;
printf("请输入要删除元素的位置i:\n");
scanf("%d",&i);
h=search(L,i,&per); if(per==NULL)
{
printf("i值有误\n");
exit(-1);
}
per->next=h->next;
free(h);
putchar(10);
return;
}
6.对链表中指定元素进行增、删操作:
pnode searchs(pnode L,int val,pnode *per)//在链表中查找元素val,并返回元素val所在的节点p的地址,及此节点前一节点per的地址
{
pnode p;
*per=L;
p=L->next; while(p!=NULL && p->date!=val)
{
*per=p;
p=p->next;
}
if(p==NULL) *per=NULL;
return p;
}
void insertslink(pnode L)//在特定元素i节点插入新节点
{
int i,val;
pnode h,k,per;
h=(pnode)malloc(sizeof(node)); if(!h)
{
printf("内存分配失败!\n");
exit(-1);
}
printf("请输入特定元素i,及所插入元素val:\n");
scanf("%d %d",&i,&val);
h->date=val;
k=searchs(L,i,&per); if(!per)
{
printf("i值有误\n");
exit(-1);
}
h->next=k;
per->next=h;
putchar(10);
return;
}
void deleteselement(pnode L)//删除特定元素
{
pnode h,per;
int val;
printf("请输入要删除的特定元素val:\n");
scanf("%d",&val);
h=searchs(L,val,&per); if(per==NULL)
{
printf("i值有误\n");
exit(-1);
}
per->next=h->next;
free(h);
putchar(10);
return;
}
7.主函数:
int main()//主函数
{
pnode L;
initlink(&L);
createlink(L);
traverselink(L);
insertlink(L);
traverselink(L);
deleteelement(L);
traverselink(L);
insertslink(L);
traverselink(L);
deleteselement(L);
traverselink(L);
return 0;
}
链表是数据结构与算法的基础知识点,而单链表则又是链表的基础,可谓基础中的基础,地基中的钢筋,还是要认真学一学的。
好了,又到了推荐时间咯!
小小推荐:
前端案例系列:
前端小案例:登录页面
C语言案例系列:
C语言小案例:登录界面
C语言小案例:学生管理系统1.0版
撕烂数据爆锤算法系列:
撕烂数据爆锤算法:循环链表
撕烂数据爆锤算法:内排序之插入算法
路就在脚下,
不管多长,不管多崎岖,
追寻梦想的脚步不会停下 !
共勉 ~~ 共勉 ~ ~