目录
前言
正文
总结
前言
链表就是结构体变量的串联。
正文
#include
#include
struct student {
int score;
struct student *next;
};
//创建头结点
struct student* creatlist(){
struct student *head=malloc(sizeof(struct student));
head->next=NULL;
return head;
}
//创建结点 需要传入数据,把数据变成结点!!
struct student* creatnode(int score){
struct student* newnode=malloc(sizeof(struct student));
newnode->score=score;
newnode->next=NULL;
return newnode;
}
//1插入结点:头插法:这样输入数据的顺序与在链表中数据的顺序是相反的
void insertbyhead(struct student* head,int score){
struct student* newnode=creatnode(score);
if(head!=NULL){
newnode->next=head->next;
head->next=newnode;
}else{
printf("链表未创建\n");
}
}
//2根据数据删除某个结点(可以思考一下如果有多个重复的数据,如何删除完所有数据)
void deletnode(struct student* head,int score){
struct student* p=head->next;
struct student* last=head;
while(p!=NULL){
if(p->score==score){
//怎么删除呢?1把它上一个结点的next=p->next 2free(p) 所以需要再定义一个指针来表示上一个
last->next=p->next;
free(p);
break;
}else{
p=p->next;
last=last->next;
}
}
if(p==NULL){
printf("未找到该数据,无法删除!\n");
}
}
//3根据数据查找某结点(可以思考一下如果有多个重复的数据,如何查找到有多少个相同的数据)
void findnode(struct student* head,int score){
struct student* p=head->next;
while(p!=NULL){
if(p->score==score){
printf("找到了,该结点数据为%d\n",p->score);
break;
}else{
p=p->next;
}
}
if(p==NULL){
printf("未找到该结点数据\n");
}
}
//4改变某结点的数据
void changenode(struct student* head,int score,int newscore){
struct student* p=head->next;
while(p!=NULL){
if(p->score=score){
p->score=newscore;
break;
}else{
p=p->next;
}
}
if(p==NULL){
printf("未找到该结点数据,无法改变\n");
}
}
//打印链表
void print(struct student* head){
struct student* p=head->next;
//打印的时候不能从头开始打印,因为第一个表头是不存放数据的,其中的数是未知的,故让p=head->next开始
while(p){
printf("%d\n",p->score);
p=p->next;
}
}
//释放链表
void freelist(struct student *head)
{
struct student * p;
p=head;
while(p!=NULL){
head=p->next;//让头指针下移,保证链表还找得到
free(p);//释放了那块内存,p仍然指向那里
//当到最后一个结点时,head会变成NULL,p也需要置空
p=head;
}
}
int main(void){
struct student* head=creatlist();
int n=1;
while(n<=6){
int a;
scanf("%d",&a);
insertbyhead(head,a);
n++;
}
deletnode(head,7);//删除7,8 结点
deletnode(head,8);
findnode(head,4);//查找有无 4 结点
changenode(head,4,3);//把4改成3
print(head);
}
输入示例:
1 2 3 4 7 8
输出结果:
找到了,该结点数据为4
3 3 2 1
总结
掌握构建链表的一个流程:
已有 创建头结点函数、创建新结点的函数(参数是数据):把数据变成结点、还有一个插入结点的函数:头插 。 以及其他一些增删改查的功能函数
主函数:
先定义一个结构体指针 用 struct student* head=创建头结点函数(),这样就能得到一个空的链表,即得到一个表头
其次输入数据,使用插入结点函数(其参数是头指针和数据) 使得结点插入到头结点后面
在插入结点函数里面 调用了创建新结点的函数使得我们的数据变成结点 ,才可以插入
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)