#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct List{
long long n;
char cn[100];
char an[100];
struct List *next;
}AnimeList;
AnimeList *Creat(int n);//创建链表
AnimeList *ListSort(AnimeList *p);//链表排序按照从小到大的顺序,返回的是排序后链表的首地址,
AnimeList *ListPartFind(AnimeList *p,int n);//返回第N项的地址
void Insert(AnimeList *p);//添加节点
void Change(AnimeList *p);//改变节点数据
void Delete(AnimeList *p);//删除节点(选择删除)
void Delete_P(AnimeList *p,int n);//删除第N项节点
void PrintList(AnimeList *P);//输出(自选)
void ListSearch(AnimeList *p);//按照条件搜索
void CopyListPart(AnimeList *a,AnimeList *b);//复制后面给前面
int ListSearchMin(AnimeList *p);//寻找最小学号的是第几项
int ListLength(AnimeList *p);//返回链表长度
int main(){
int n;
scanf("%lld",&n);
AnimeList *p=Creat(n);
int t;
PrintList(p);
p=ListSort(p);
PrintList(p);
return 0;
}
AnimeList *Creat(int n){
AnimeList *head,*end,*node;
head=(AnimeList *)malloc(sizeof(AnimeList));
end=head;
int i=0;
while(i++<n){
node=(AnimeList *)malloc(sizeof(AnimeList));
printf("请输入动漫编号\n");
scanf("%lld",&node->n);
printf("请输入动漫名\n");
scanf("%s",&node->an);
printf("请输入角色名\n");
scanf("%s",&node->cn);
printf("创建完成,数据存储成功\n\n");
end->next=node;
end=node;
}
end->next=NULL;
return head;
}
int ListLength(AnimeList *p){
AnimeList *node=p->next;
int t=0;
while(node!=NULL){
t++;
node=node->next;
}
return t;
}
void Insert(AnimeList *p){
AnimeList *node=p,*end;
printf("请选择在第几项插入\n");
int n,i=0;
char c;
scanf("%lld",&n);
printf("请选择前插还是后插\n前插(1)\n后插(2)\n");
getchar();
while(1){
i=0;
scanf("%c",&c);
if(c=='1'){
i=1;
while(i<n){
node=node->next;
i++;
}
end=(AnimeList *)malloc(sizeof(AnimeList));
printf("请输入动漫编号\n");
scanf("%lld",&end->n);
printf("请输入动漫名\n");
scanf("%s",&end->an);
printf("请输入角色名\n");
scanf("%s",&end->cn);
printf("创建完成,数据存储成功\n\n");
end->next=node->next;
node->next=end;
break;
}
else if(c=='2'){
while(i++<n)
node=node->next;
end=(AnimeList *)malloc(sizeof(AnimeList));
printf("请输入动漫编号\n");
scanf("%lld",&end->n);
printf("请输入动漫名\n");
scanf("%s",&end->an);
printf("请输入角色名\n");
scanf("%s",&end->cn);
printf("创建完成,数据存储成功\n\n");
end->next=node->next;
node->next=end;
break;
}
else
printf("输入错误,请重新输入\n");
}
}
void PrintList(AnimeList* P){
int n,i;
AnimeList* p=P;
char c;
getchar();
while(1){
printf("请选择\n输出特定单项(1)\n输出全部(2)\n");
scanf("%c",&c);
if(c=='1'){
i=0;
printf("要输出第几项?\n");
scanf("%lld",&n);
while(i<n){
p=p->next;
i++;}
printf("编号:%lld\n动漫名称:%s\n角色名称:%s\n",p->n,p->an,p->cn);
break;
}
else if(c=='2'){
p=p->next;
while(p!=NULL){
printf("编号:%lld\t动漫名称:%s\t角色名称:%s\n",p->n,p->an,p->cn);
p=p->next;
}
break;
}
else
printf("输入错误,请重新输入\n");
}
}
void Change(AnimeList *p){
AnimeList *node=p;
int n,i=0;
printf("现在一共有%lld项,要改哪个?\n",ListLength(p));
scanf("%lld",&n);
while(i<n){
node=node->next;
i++;
}
while(1){
printf("请选择要改的地方\n1)编号\t2}动漫名称\t3}角色名\n");
scanf("%lld",&n);
if(n==1){
scanf("%lld",&node->n);
break;}
else if(n==2){
scanf("%s",&node->an);
break;}
else if(n==3){
scanf("%s",&node->cn);
break;}
else
printf("输入错误,请重新输入\n");
}
}
void Delete(AnimeList *p){
AnimeList *node=p,*end;
int n,i=0;
printf("现在有%d项,你要删除第几项?\n",ListLength(p));
scanf("%lld",&n);
while(i<n-1){
node=node->next;
i++;
}
end=node->next;
node->next=end->next;
free(end);
}
void ListSearch(AnimeList *p){
AnimeList *node=p;
printf("请选择搜索方式\n1)按照编号2)按照动漫名3)按照角色名\n");
int i,n,t=0,s;
char a[100];
while(1){
scanf("%lld",&n);
if(n==1){
printf("请输入要搜索的编号\n");
scanf("%lld",&s);
while(node->next!=NULL){
t++;
node=node->next;
if(node->n==s){
printf("找到了,是第%d项\n",t);
break;
}
}
if(node->next==NULL)
printf("没找到\n");
break;
}
else if(n==2){
printf("请输入要搜索的动漫名\n");
scanf("%s",&a);
while(node->next!=NULL){
t++;
node=node->next;
if(strcmp(node->an,a)==0){
printf("找到了,是第%d项\n",t);
break;
}
}
if(node->next==NULL){
printf("没找到\n");
}
break;
}
else if(n==3){
printf("请输入要搜索的角色名\n");
scanf("%s",&a);
while(node->next!=NULL){
t++;
node=node->next;
if(strcmp(node->cn,a)==0){
printf("找到了,是第%d项\n",t);
break;
}
}
if(node->next==NULL){
printf("没找到\n");
}
break;
}
else
printf("输入错误,请重新输入\n");
}
}
int ListSearchMin(AnimeList *p){
int i=1,index=1;
AnimeList *head=p->next;
long long r=head->n;
while(head->next!=NULL){
head=head->next;
i++;
if(head->n<r){
index=i;
}
}
return index;
}
void CopyListPart(AnimeList *a,AnimeList *b){
a->n=b->n;
strcpy(a->cn,b->cn);
strcpy(a->an,b->an);
}
AnimeList *ListPartFind(AnimeList *p,int n){
p=p->next;
int i=1;
while(i<n){
p=p->next;
i++;
}
return p;
}
void Delete_P(AnimeList *p,int n){
AnimeList *node=p,*end;
int i=0;
while(i<n-1){
node=node->next;
i++;
}
end=node->next;
node->next=end->next;
free(end);
}
AnimeList *ListSort(AnimeList *p){
AnimeList *head_o=p,*node,*end,*head,*min;
head=(AnimeList *)malloc(sizeof(AnimeList));
end=head;
int t=ListLength(p);
int i=0;
int m;
while(p->next!=NULL){
node=(AnimeList *)malloc(sizeof(AnimeList));
m=ListSearchMin(p);
min=ListPartFind(p,m);
CopyListPart(node,min);
Delete_P(p,m);
end->next=node;
end=node;
}
end->next=NULL;
return head;
}