typedef的用法 单向链表的查找、增加、删除、销毁。

一:typedef的用法。
写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。

/*定义一个叫student的结构体*/
struct student
{
    int Id;
    char name[20];       
};
struct student stu1,stu2;   //定义了2个名字分别为stu1和stu2的结构体
struct student *stu;         //定义一个指向stu的4字节的指针
typedef struct student * head;  //将struct student * 定义为 head
head h;                     //直接用head 就可以定义头指针

二:单向链表的查找、增加、删除、销毁。

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)


struct student
{
    int Id;
    char name[20];
    struct student *next;
};

typedef struct student * head;      //用typedef 以后我定义指针就直接用head了。

head Input(head h);
head Delete();
int Ruin(head h);
void Print();
head Find();
void biaotou();

void biaotou()
{
    printf("\n 信息表\n");
    printf("学生编号\t学生姓名\n");
}
head Find(head h)
{
    int Id;
    head p;

    printf("请输入学生编号\n");
    scanf("%d",&Id); 
    for(p = h ;p->next;p = p->next)   //查找过程 
    {                                                                                                                        
        if(p->next->Id == Id)         //为什么直接用p->next->Id ,
        //原因是返回要找的前驱节点,以后删除和增加的时候都有好处。

        {
            biaotou();
            printf("%d\t\t%s\n",p->next->Id,p->next->name);
            break;
        }
    }
        if(p->next == NULL)
        {
            printf("没有此学号\n");
        }


    return(p);
}
void Print(head h)
{
    head p;

    printf("\n 信息表\n");
    printf("学生编号\t学生姓名\n");
    for(p = h->next; p; p = p->next)    //显示的时候直接显示p->next
    printf("%d\t\t%s\n",p->Id,p->name);


}
int Ruin(head h)
{
    head p = NULL;
    int choice;

    printf("确定销毁整个链表?(1:销毁,2:不销毁)\n");
    scanf("%d",&choice);
    if(choice == 1)
    {
    for(p;h->next;)            //传进来头结点 然后每次保存h->next  
    {                          //改链域之后在删除第二个,然后第三个,
        p = h->next;
        h->next = p->next;
        free(p);               //最后需要把最后一个也释放
    }
    free(h);
        printf("销毁成功\n");
    }
    if(choice == 2)
    {
        return 0;
    }
}
head Delete(head t)
{
    head p;

    p = t->next;   //保存要删除的节点
    t->next = p->next;  //更改链域绕过要删除的节点
    free(p);          //删除要删除的节点
    printf("删除成功\n");

}

void Add(head t)  //在插入之前,已经查找了插入点的位置
{
    head p ;  // t:find()函数的返回值,返回查找到点的前驱节点

    p = (head) malloc (LEN);                            
    printf("请输入要插入学生的信息\n");
    printf("请输入学生Id\n");
    scanf("%d",&p->Id);
    printf("请输入学生姓名\n");
    scanf("%s",p->name); //准备好要插入的信息

    p->next = t->next;  //将要插入的节点与后一个节点相连
    t->next = p; //将前驱节点与要插入的节点相连即可


}
head Input(head h)
{
    char choice;
    head p;
    head q;
    h = (head) malloc(LEN); //整个结构要清晰  head p; 
    //表示p是一个四字节的,指向结构体的指针
    q = h; //malloc 之后,就相当于有了空间 并且p指向它
    do
    {
        p = (head) malloc(LEN);
        printf("请输入学生Id\n");
        scanf("%d",&p->Id);
        printf("请输入学生姓名\n");
        scanf("%s",p->name);
        p->next = NULL;
        h->next = p;
        h = p;
        printf("Contine?(Y/N)\n");
        getchar();
        scanf("%c",&choice);
    }while(choice == 'Y'||choice == 'y' );

    return(q);

}



int main(int argc,char *agrv[])
{
    head h = NULL;
    head t = NULL; //查找到的学生信息id所指的指针
    int choice;

    printf("学生信息\n");
    do
    {
        printf("1:输入信息\n");
        printf("2:增加信息\n");
        printf("3:删除信息\n");
        printf("4:销毁信息\n");
        printf("5:显示信息\n");
        printf("6:查找信息\n");
        printf("0:退出程序\n");
        printf("请输入:");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                h = Input(h);
                break;
            case 2:
                printf("请先确定要插入的位置学号(前插入)是否存在\n");
                printf("注意:若不存在,默认插入到最后\n");
                t = Find(h);
                Add(t);
                break;
            case 3:
                printf("请先确定要删除的学号是否存在\n");
                t = Find(h);
                Delete(t);
                break;
            case 4:Ruin(h);
                break;
            case 5:Print(h);
                break;
            case 6:Find(h);
                break;
        }
    }while(choice != 0);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨博东的博客

请我喝瓶可乐鼓励下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值