啦啦啦,我又來了,我帶着《數據結構與算法》愉快地走來了(那是相當的愉快,不信你瞧,我頭上僅剩的髮絲正歡呼雀躍地漫天紛飛,哭!)。數據結構與算法作爲編程的核心內容,其重要性不言而喻,不論你將來是要考研進修還是進大廠面試,他都會默默的陪伴你,不離不棄。爲了自己的未來,我發誓我要好好學習數據結構,要用自己的滿腔熱血感化它,嗯,給自己的勇氣加油!
本篇是自己對數據結構中基礎中的基礎——單鏈表的總結,如有不足之處,希望各位大佬指點一二(徒手畫圖,有點難看,輕噴點哦,嘻嘻)。
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版
撕爛數據爆錘算法系列:
撕爛數據爆錘算法:循環鏈表
撕爛數據爆錘算法:內排序之插入算法
路就在腳下,
不管多長,不管多崎嶇,
追尋夢想的腳步不會停下 !
共勉 ~~ 共勉 ~ ~