撕爛數據爆錘算法:單鏈表

啦啦啦,我又來了,我帶着《數據結構與算法》愉快地走來了(那是相當的愉快,不信你瞧,我頭上僅剩的髮絲正歡呼雀躍地漫天紛飛,哭!)。數據結構與算法作爲編程的核心內容,其重要性不言而喻,不論你將來是要考研進修還是進大廠面試,他都會默默的陪伴你,不離不棄。爲了自己的未來,我發誓我要好好學習數據結構,要用自己的滿腔熱血感化它,嗯,給自己的勇氣加油!

本篇是自己對數據結構中基礎中的基礎——單鏈表的總結,如有不足之處,希望各位大佬指點一二(徒手畫圖,有點難看,輕噴點哦,嘻嘻)。

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版

撕爛數據爆錘算法系列:
撕爛數據爆錘算法:循環鏈表
撕爛數據爆錘算法:內排序之插入算法

路就在腳下,
不管多長,不管多崎嶇,
追尋夢想的腳步不會停下 !
共勉 ~~ 共勉 ~ ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章