撕烂数据爆锤算法:单链表

啦啦啦,我又来了,我带着《数据结构与算法》愉快地走来了(那是相当的愉快,不信你瞧,我头上仅剩的发丝正欢呼雀跃地漫天纷飞,哭!)。数据结构与算法作为编程的核心内容,其重要性不言而喻,不论你将来是要考研进修还是进大厂面试,他都会默默的陪伴你,不离不弃。为了自己的未来,我发誓我要好好学习数据结构,要用自己的满腔热血感化它,嗯,给自己的勇气加油!

本篇是自己对数据结构中基础中的基础——单链表的总结,如有不足之处,希望各位大佬指点一二(徒手画图,有点难看,轻喷点哦,嘻嘻)。

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版

撕烂数据爆锤算法系列:
撕烂数据爆锤算法:循环链表
撕烂数据爆锤算法:内排序之插入算法

路就在脚下,
不管多长,不管多崎岖,
追寻梦想的脚步不会停下 !
共勉 ~~ 共勉 ~ ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值