链表操作--创建--删除--插入--打印

来源:互联网 发布:丝路英雄冒险最新数据 编辑:程序博客网 时间:2024/05/11 22:19

//链表的综合操作!!!
#include
#include
struct student * creat(void);
void print(struct student *head);
struct student * del(struct student * head ,long num);
struct student * insert(struct student *head,struct student *stud);
int n;
struct student
{
    long num;
    float score;
    struct student * next;
};
int main()
{
    struct student * head,stu;
    long del_num;
    printf("input records:/n");
    head = creat();                    //建立链表,返回指针
    print(head);                        //输出全部结点
    printf("/ninput the deleted number:");
    scanf("%ld",&del_num);                //输入要删除的结点的学号
    head=del(head,del_num);            //删除后链表的头地址
    print(head);
    printf("/ninput the inserted record:");    //输入要插入的结点
    scanf("%ld %f",&stu.num,&stu.score);
    head = insert(head,&stu);            //插入一个结点,返回头结点地址
    print(head);                        //输出全部结点
}
struct student * creat(void)
{
    struct student *head;
    struct student *p1,*p2;
    n=0;
    printf("输入格式为/"学号/"+空格+/"成绩/"/n");
    p1=p2=(struct student *) malloc(sizeof(struct student));//开辟一个新单元
    scanf("%ld %f",&p1->num,&p1->score);
    head = NULL;
    while(p1->num != 0)
    {
        n = n+1;
        if( n == 1)    head = p1;
        else            p2->next=p1;
        p2 = p1;
        p1=(struct student *)malloc(sizeof(struct student));
        scanf("%ld %f",&p1->num,&p1->score);
    }
    p2->next = NULL;
    return(head);
}
struct student * del(struct student * head ,long num)
{
    struct student *p1,*p2;
    if(head == NULL) {printf("/nlist null!/n"); return head;}
    else
    {    p1=head;
        while(num != p1->num && p1->next != NULL)        //p1指向的不是要找的结点,并且后面还有结点
        {p2=p1;p1=p1->next;}                            //p1后移一个结点
        if(num == p1->num)                            //找到了
        {
            if(p1 == head) head =p1->next;                //若p1指向的是首结点,把第二个结点地址赋予head
else p2->next = p1->next;                    //否则将下一结点地址赋给前一结点地址
            printf("delete :%ld/n",num);
            n=n-1;
        }
        else printf("%ld not been found !/n",num);            //找不到该结点
        return(head);
    }
}
struct student * insert(struct student *head,struct student *stud)
{
    struct student *p0,*p1,*p2;
    p1 = head;
    p0 = stud;
    if(head == NULL)
        {head = p0; p0->next = NULL;}
    else
    {
        while((p0->num > p1->num)&&(p1->next != NULL))//如果比这个大,那就继续向下寻找。。。
        {
            p2 = p1;
            p1 =  p1->next;
        }
        if(p0->num <= p1->num)
        {
            if(head == p1) head = p0;                    //插入到原来的第一个结点之前
            else p2->next = p0;                        //插入到p2指向的结点之后
            p0->next = p1;
        }
        else{p1->next = p0;p0->next=NULL;}
    }
    n=n+1;
    return(head);
}
void print(struct student *head)
{
    struct student * p;
    printf("/nNow,These %d records are:/n",n);
    p=head;
    if(head != NULL)
        do
            {printf("%ld %5.1f/n",p->num,p->score);
             p=p->next;
             }while(p != NULL);
}

原创粉丝点击