链表

引入:数组的分类:便于遍历
静态数组:int arr[10] 数据过多造成 空间溢出 数据过小 空间浪费
动态数组:malloc calloc realloc 合理利用空间 不能快捷的 插入或删除数据(会涉及到大量的数据移动)

链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。

链表由一系列节点组成,节点在运行时动态生成,每个节点包括两部分:
1、存储数据的数据域
2、存储下一个节点地址的指针域

链表的各种操作(分文件)

#include <stdio.h>
#include <string.h>
#include "link.h"
int main(int argc, char *argv[])//主函数
{
	STU *head = NULL;
	help_link();
	while(1)
	{
		printf("请输入操作指令:");
		char cmd[32]="";
		scanf("%s",cmd);
			
		if(strcmp(cmd,"help")==0)
		{
			help_link();//打印帮助信息
		}
		else if(strcmp(cmd,"insert")==0)
		{
			STU tmp ={};
			printf("请输入要插入的节点信息");
			scanf("%s %d %f",tmp.name,&tmp.num,&tmp.score);

			head = insert_link(head,tmp);//有序插入节点信息
		}
		else if(strcmp(cmd,"print")==0)
		{
			print_link(head);//打印链表节点信息
		}
		else if(strcmp(cmd,"search")==0)
		{
			char name[32]="";
			printf("请输入您要搜索的学生姓名:");
			scanf("%s",name);
			
			search_link(head,name);//搜索链表节点信息
		}
		else if(strcmp(cmd,"delete")==0)
		{
			char name[32]="";
			printf("请输入您要删除的学生姓名:");
			scanf("%s",name);
			
			head = delete_link(head,name);//删除链表节点信息
			print_link(head);
		}
		else if(strcmp(cmd,"reverse")==0)
		{
			head = reverse(head);//链表的逆序
			printf("链表已成功逆序\n");
		}
		else if(strcmp(cmd,"sort")==0)
		{
			head = sort_link(head);//链表的排序
			printf("链表已成功排序\n");
		}
		else if(strcmp(cmd,"free")==0)
		{
			head=free_link(head);//链表的释放
		}
		else if(strcmp(cmd,"quit")==0)
		{
			free_link(head);//链表的释放
			break;
		}
		else
		{
			printf("您输入的命令有误请重新输入\n");
		}
	}

	return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"link.h"

void help_link(void)//打印帮助信息
{
	printf("***************************\n");
	printf("*help打印帮助信息         *\n");
	printf("*insert插入链表节点       *\n");
	printf("*print遍历链表节点信息    *\n");
	printf("*search查询链表节点       *\n");
	printf("*delete删除链表节点       *\n");
	printf("*reverse链表的逆序        *\n");
	printf("*sort链表的排序           *\n");
	printf("*free释放链表             *\n");
	printf("*quit退出                 *\n");
	printf("***************************\n");
	return;
}

STU* insert_link(STU *head,STU tmp)//有序插入链表节点
{
	STU *pi = NULL;
	pi = (STU *)calloc(1,sizeof(STU));//动态申请堆区空间
	if(pi == NULL)
	{
		perror("calloc");
		return NULL;
	}
	
	*pi = tmp;//把tmp的值赋值给pi
	pi->next = NULL;

	if(head == NULL)
	{
		head = pi;
		return head;
	}
	else
	{
		STU *pb = head,*pf;
		while(pb->num<pi->num && pb->next!=NULL)
		{
			pf = pb;//pf保存pb的节点
			pb = pb->next;
		}
		if(pb->num>=pi->num)
		{
			if(pb==head)//头部插入
			{
				pi->next=head;
				head = pi;
				return head;
			}
			else//中部插入
			{
				pf->next=pi;
				pi->next=pb;
				return head;
			}
		}
		else
		{
			pb->next=pi;
			return head;
		}

	}

	return head;
}

void print_link(STU *head)//打印节点信息
{
	if(head == NULL)
	{
		printf("link not found\n");
	}
	else
	{
		STU *pb = head;
		while(pb!=NULL)
		{
			printf("%s %d %f\n",pb->name,pb->num,pb->score);
			pb = pb->next;
		}
	}
}

void search_link(STU *head,char *name)//搜索链表节点信息
{
	if(head == NULL)
	{
		printf("link not found\n");
		return;
	}
	else
	{
		STU *pb = head;
		while(strcmp(pb->name,name)!=0 && pb->next!=NULL)
		{
			pb = pb->next;
		}
		if(strcmp(pb->name,name)==0)
		{
			printf("%s %d %f\n",pb->name,pb->num,pb->score);
		}
		else
		{
			printf("没有您要搜索的%s的学生信息\n",name);
		}
		
	}
	return;
}

STU* delete_link(STU *head,char *name)//删除链表节点信息
{
	if(head == NULL)
	{
		printf("link not found\n");
		return head;
	}
	else
	{
		STU *pb = head,*pf;
		while(strcmp(pb->name,name)!=0 && pb->next!=NULL)
		{
			pf=pb;
			pb=pb->next;
		}
		if(strcmp(pb->name,name)==0)
		{
			if(pb==head)//头部删除
			{
				free(head);
				head=pb->next;
				return head;
			}
			else//中部尾部删除
			{
				pf->next=pb->next;
				free(pb);
				return head;
			}
		}
		else
		{
			printf("没有您要查找的%s的学生信息\n",name);
			return head;
		}
	}

	return head;
}

STU *reverse(STU *head)//链表的逆序
{
	if(head == NULL)
	{
		printf("link not found\n");
		return head;
	}
	else
	{
		STU *pb = head->next,*pr;
		head->next=NULL;
		while(pb!=NULL)
		{	
			pr=pb->next;
			pb->next=head;
			head=pb;
			pb=pr;
		}
		return head;
	}
	
	return head;
}

STU* sort_link(STU *head)//链表的排序
{
	if(head == NULL)
	{
		printf("link not found\n");
		return head;
	}
	else
	{
		STU *pb=head;
		while(pb->next!=NULL)
		{
			STU *pf=pb->next;
			while(pf!=NULL)
			{
				if(pb->num>pf->num)
				{
					STU tmp;
					tmp=*pf;
					*pf=*pb;
					*pb=tmp;

					tmp.next=pf->next;
					pf->next=pb->next;
					pb->next=tmp.next;
				}

				pf=pf->next;
			}

			pb=pb->next;
		}
		return head;
	}
	return head;
}

STU* free_link(STU *head)//链表的释放
{
	if(head == NULL)
	{
		printf("link not found\n");
		return head;
	}
	else
	{
		STU *pb=head;
		while(pb!=NULL)
		{
			pb=head->next;
			free(head);
			head=pb;
		}
		printf("链表已成功释放\n");
		return head;
	}
	return head;
}


#ifndef __LINK_H__
#define __LINK_H__

typedef struct stu
{
	int num;
	char name[32];
	float score;//数据域

	struct stu *next;//指针域
}STU;

extern void help_link(void);//打印帮助信息
extern STU* insert_link(STU *head,STU tmp);//有序插入链表节点
extern void print_link(STU *head);//打印节点信息
extern void search_link(STU *head,char *name);//搜索链表节点信息
extern STU* delete_link(STU *head,char *name);//删除链表节点信息
extern STU *reverse(STU *head);//链表的逆序
extern STU* sort_link(STU *head);//链表的排序
extern STU* free_link(STU *head);//链表的释放

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值