C语言 链表的构建以及增删改查功能

C语言 链表的构建以及增删改查功能,第1张

目录

前言

正文

总结


前言

    链表就是结构体变量的串联。


正文
#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=创建头结点函数(),这样就能得到一个空的链表,即得到一个表头
            其次输入数据,使用插入结点函数(其参数是头指针和数据) 使得结点插入到头结点后面 
            在插入结点函数里面   调用了创建新结点的函数使得我们的数据变成结点 ,才可以插入 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存