目錄
1.鏈表的創建
2鏈表的插入
3.鏈表的遍歷
4.鏈表的清空
5.鏈表的銷毀
6.鏈表的指定值的洗掉
7.完整的實作功能
1.鏈表的創建
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct linklist
{
int a;
struct linklist*next;
}link;
link* header()
{
link *p=malloc(sizeof(link));
p->a=1;
p->next=NULL;
int val=0;
//創建尾部指標
link* end=p;
printf("請輸入你的資料(以-1代表輸入結束):\n");
while(true)
{
scanf("%d",&val);
if(val!=-1)
{
link *linknext=malloc(sizeof(link));
linknext->a=val;
linknext->next=NULL;
end->next=linknext;
//更新尾部指標
end=linknext;
}
else
{
break;
}
}
return p;
}
鏈表的創建及其初始化
鏈表的創建為結構體 加指標指標的方式創建
鏈表的初始化則是通過對頭節點的賦值來實作的

先創建一個頭節點也就是link*p=malloc(sizeof(link))
然后創建指標變數指向頭節點,然后隨著節點的創建移動指標變數鏈表即創建完畢
2鏈表的插入
//在原來數字后插入一個值
void oldlink(link* header)
{
int olddate,newdate;
//創建兩個節點
link*current=header;
printf("是否要插入尾部:\n");
printf("0代表插入,1則不插入\n");
int b;
scanf("%d",&b);
if (b==1)
{
printf("原來的數字為:\n");
scanf("%d",&olddate);
printf("要插入的數字為:\n");
scanf("%d",&newdate);
link*newcurrent=current->next;
while(current->a!=olddate)
{
current=newcurrent;
newcurrent=current->next;
}
if(newcurrent==NULL)
{
printf("未找到目標值,插入失敗\n");
}
else
{
link*new=malloc(sizeof(link));
new->a=newdate;
current->next=new;
new->next=newcurrent;
printf("插入成功\n");
}
}
//直接插入尾部
else if(b==0)
{
printf("要插入的數字為:\n");
scanf("%d",&newdate);
link*lin=header;
while(lin->next!=NULL)
{
lin=lin->next;
}
link*new=malloc(sizeof(link));
new->a=newdate;
new->next=NULL;
lin->next=new;
printf("插入成功\n");
printf("---------------\n");
}
}
可以鏈表中插入值,得用雙指標

需要更改前一個的next還需要拿到后一個的地址來存放到當前節點
注意:
借助while回圈即可實作但插入不到最后(如果有更好的代碼請評論一下我沒有想到),還有鏈表中的數字不能重復否則無法實作,借助if可以認為判斷一下
3.鏈表的遍歷
void print (link* head)
{
link* p=head;
printf("你的資料為:\n");
while(p->next!=NULL)
{
p=p->next;
printf("%d\n",p->a);
}
}
4.鏈表的清空
void clearlink(link* header)
{
if(header==NULL)
{
return;
}
link*p=header;
while(p!=NULL)
{
link*lin=p->next;
free(p);
p=lin;
}
header->next=NULL;
}
//洗掉節點
需要借助一個新的指標變數來保存地址不然一旦free后便早不到后面的地址了,追后初始化NULL即可完成
5.鏈表的銷毀
和鏈表的清空差不多,不過多free了一次
6.鏈表的指定值的洗掉
void cutlink(link* header)
{
int a;
printf("請輸入要洗掉的數字:\n");
scanf("%d",&a);
link*p=header;
link*oldheader=NULL;
//上一個節點
link *older=NULL;
while(p->a!=a)
{
oldheader=p;
p=p->next;
}
if(p->a==a&&p->next!=NULL)
{
oldheader->next=p->next;
printf("洗掉成功\n");
printf("--------------\n");
}
else if(p->a==a&&p->next==NULL)
{
oldheader->next=NULL;
printf("洗掉成功\n");
printf("----------\n");
}
else if(p->a!=a)
{
printf("未查詢到該數字\n");
printf("---------------\n");
}
}
注意:不能完全洗掉的數字,只能洗掉第一個
7.完整的實作功能
.h
#ifndef _TEST_H_
#define _TEST_H_
typedef struct linklist
{
int a;
struct linklist*next;
}link;
//初始化鏈表
link* header();
//遍歷鏈表
void print (link* header);
//在鏈表后加一個舊的值新的值
void oldlink(link* header);
//銷毀鏈表
void dellink(link* header);
//清空鏈表
void clearlink(link* header);
//洗掉節點
void cutlink(link* header);
#endif
.c
#include"linklist.h"
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//初始化鏈表
link* header()
{
link *p=malloc(sizeof(link));
p->a=1;
p->next=NULL;
int val=0;
//創建尾部指標
link* end=p;
printf("請輸入你的資料(以-1代表輸入結束):\n");
while(true)
{
scanf("%d",&val);
if(val!=-1)
{
link *linknext=malloc(sizeof(link));
linknext->a=val;
linknext->next=NULL;
end->next=linknext;
//更新尾部指標
end=linknext;
}
else
{
break;
}
}
return p;
}
//遍歷鏈表
void print (link* head)
{
link* p=head;
printf("你的資料為:\n");
while(p->next!=NULL)
{
p=p->next;
printf("%d\n",p->a);
}
}
//在原來數字后插入一個值
void oldlink(link* header)
{
int olddate,newdate;
//創建兩個節點
link*current=header;
printf("是否要插入尾部:\n");
printf("0代表插入,1則不插入\n");
int b;
scanf("%d",&b);
if (b==1)
{
printf("原來的數字為:\n");
scanf("%d",&olddate);
printf("要插入的數字為:\n");
scanf("%d",&newdate);
link*newcurrent=current->next;
while(current->a!=olddate)
{
current=newcurrent;
newcurrent=current->next;
}
if(newcurrent==NULL)
{
printf("未找到目標值,插入失敗\n");
printf("---------------");
}
else
{
link*new=malloc(sizeof(link));
new->a=newdate;
current->next=new;
new->next=newcurrent;
printf("插入成功\n");
printf("-------------");
}
}
//直接插入尾部
else if(b==0)
{
printf("要插入的數字為:\n");
scanf("%d",&newdate);
link*lin=header;
while(lin->next!=NULL)
{
lin=lin->next;
}
link*new=malloc(sizeof(link));
new->a=newdate;
new->next=NULL;
lin->next=new;
printf("插入成功\n");
printf("---------------\n");
}
}
//銷毀鏈表
void dellink(link* header)
{
}
//清空鏈表
void clearlink(link* header)
{
if(header==NULL)
{
return;
}
link*p=header;
while(p!=NULL)
{
link*lin=p->next;
free(p);
p=lin;
}
header->next=NULL;
}
//洗掉節點
void cutlink(link* header)
{
int a;
printf("請輸入要洗掉的數字:\n");
scanf("%d",&a);
link*p=header;
link*oldheader=NULL;
//上一個節點
link *older=NULL;
while(p->a!=a)
{
oldheader=p;
p=p->next;
}
if(p->a==a&&p->next!=NULL)
{
oldheader->next=p->next;
printf("洗掉成功\n");
printf("--------------\n");
}
else if(p->a==a&&p->next==NULL)
{
oldheader->next=NULL;
printf("洗掉成功\n");
printf("----------\n");
}
else if(p->a!=a)
{
printf("未查詢到該數字\n");
printf("---------------\n");
}
}
int main()
{
link*text=header();
print(text);
oldlink(text);
print(text);
cutlink(text);
print(text);
clearlink(text);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301755.html
標籤:其他
上一篇:當過服務員、快遞員,現在年薪30W,歷盡山河叛逆少年侄訓成長
下一篇:H3C License授權之實戰
