引入:数组的分类:便于遍历
静态数组: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