鱼C论坛

 找回密码
 立即注册
查看: 1343|回复: 0

[技术交流] 链表的初步雏形。和大家分享

[复制链接]
发表于 2015-4-2 21:14:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
// 写一个函数删除动态链表中的节点(加入一个链表)

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define  LEN sizeof(struct student) //student结构的大小

struct student *crcat();   //创建链表

void print(struct student *heads);//打印链表函数

struct student *jianli(struct student *herd);     //在链表中插入节点;

void deletes(struct student *head);// 删除链表的函数。

struct student       
{
        int num;
        float score;

        struct student *next;
};

int n; //全局变量;用来记录存放了多少个数据

void main()
{

        struct student *stu,*std;//指向链表的指针。
        stu = crcat();
        print(stu);   //打印链表

        std=jianli(stu);//插入节点。

    print(std);

        printf("\n\n");

        deletes(std); //删除链表。



        system("pause");//按任意键继续。

}

struct student *crcat()//
{

        struct student *head;  //指向链表的指针
        struct student *p1,*p2;//指向链表的指针
        p1=p2=(struct student *)malloc(LEN);//p1  p2 指向新开辟的空间

        printf("please enter the num:");
        scanf("%d",&p1->num);          //输入学生号。
    printf("please enter the score:");
        scanf("%f",&p1->score);        //输入姓名。

        head = NULL;        //head= 0.
        n = 0;         
       

        while(p1->num != 0)  //  p1 指向的num不等于0的话执行下列语句。
        {
                n++;                  //n递增1  
                if(1 == n)                       //n=1的话head指向头结点。
                {
                        head = p1;
                }
                else                 //如果n不为1的话 p2链表的指针指向下一个链表。
                {
                        p2->next = p1;
                }
                p2 = p1;             // p2指向p1.     
                p1 = (struct student *)malloc(LEN);   //新开辟的空间地址给p1
               
                printf("\nplease enter the num:");

                scanf("%d",&p1->num);
                printf("please enter the score:");
                scanf("%f",&p1->score);
        }
        p2->next = NULL;  //如果p1->num = 0的话p2->next = 0;
        return head;  //返回该链表的头结点。

}

void print(struct student *heads) //打印链表。
{
        struct student *p;
        printf("\nTher aer %d recor!\n\n",n);
        p=heads;
        if(heads)
        {
                do
                {
                        printf("学号为 %d 成绩是:%f\n",p->num,(*p).score);
                        p = p->next;
                }while(p); //判断p->next 为 NULL就结束循环。
        }
}

struct student *jianli(struct student *herd)                            //插入链表
{
        struct student *p0,*p1,*p2;

    p1=p2=herd;
        p0 = (struct student *)malloc(LEN);

        printf("输入要插入的节点");
        scanf("%d",&p0->num);
printf("输入节点数据");
        scanf("%d",&p0->score);

while(p0->num!=0)
{
        while(p0->num>p1->num&&p1->next!=NULL)
        {
                p2=p1;

                p1=p1->next;
        }
        if(p0->num<=p1->num)
        {
                if(herd==p1)
                {
                        herd=p0;
                        p0->next=p1;
                }
                else
                {
                        p2->next=p0;
                        p0->next=p1;
                }

        }
        else
        {
                p1->next=p0;
                p0->next=NULL;
        }
        p0=(struct student *)malloc(LEN);

        printf("输入要插入的节点");
            scanf("%d",&p0->num);
        printf("输入节点数据");
             scanf("%d",&p0->score);

}
    n=n+1;
        return herd;
}

void deletes(struct student *head)
{
        struct student *p1,*p2;
        int w;
        p1 = p2 = head;
        printf("输入要删除的节点");
    scanf("%d",&w);
       
       
       if(NULL == head)
           {
                   goto END;
           }
       
        while(w != p1->num&&p1->next)
                {  
                        p2=p1;
                        p1=p1->next;
                }
                        if(p1->next)
                        {
                            printf("\t\n\n找不到\n");

                        }
                if(w == (*head).num )
                {
                        p1=(*p1).next ;
                        head = p1;
                }
                else if(w == p1->num)
                {
           p2->next = p1->next;
                }

       
END: printf("空链表");
        print(head);
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 21:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表