单链表练习()

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值