C语言链表-学生管理系统

链表:

1)链表分类:

表头:只有指针域

节点:指针域+数据域    指针域指向下一节点数据域,指针域为下一节点的首地址   即ptemp->next=pnew

表尾:指针域+数据域   指针域指向为NUL

2)链表是链式存贮结构,在空间内不一定是连续的

理解两个代码段:(1)ptemp = ptemp->next  //进行下一个节点操作

                             (2)ptemp->next = pnew; //当前节点指针域指向下一节点(当然也可以存放上一节点地址)

创建节点---创建链表---删除节点---插入节点----查询节点---修改节点

1.构造结构体

typedef struct student

{
    int ID;
    char name[10];
    float score;
    struct student *pnext 
}STD;

2.创建节点

STD *Creat_node(void)
{

    STD *pnew = (STD *)malloc(sizeof(STD));
    pnew->pnext = NULL;
    
    return pnew;
}

3.创建链表

STD *Creat_link(int num)
{
    STD *phead;
    STD *pnew,*pb;
    phead = NULL;
    
    for(int i = 0;i <= num;i++)    
    {
          pnew = Creat_node();
          if(i == 0 )
          {
            phead = pnew;
          }
          else
         {
            pb->pnext = pnew;
           
         }  
          pb = pnew;
    }
    if(phead != NULL)
    {
        pb->pnext = NULL;
    }
      return phead;

}

4.删除节点

int Delete_node(STD *phead,int ID)
{
    STD *ptemp = phead;
    STD *pdelete = NULL;
    
    if(phead == NULL)
    {
       perror("要查询的链表为空");
    }
    while(ptemp->pnext != NULL)
    {
        if(ptemp->pnext->id == ID)
        {
           pdelete = ptemp->pnext;
           ptemp=>pnext = pdelete->pnext;
            free(pdelete);
            return 1;
        }
        ptemp = ptemp->pnext;
    }
        return 0;
    
}

5.插入节点

STD *Insert_node(STD *phead,STD *pnew)
{
    STD *ptemp = phead;
    
    if(ptemp == NULL)
    {
        perror("Insert 链表为空");
        exit(0);
    }
    while(ptemp->pnext != NULL)
    {
        ptemp=ptemp->pnext;
    }
    ptemp->pnext = pnew;
    
    return ptemp;

}

6.查询节点

STD *SEEK_node(STD *phead,int id)
{
    STD *ptemp = phead;
    STD *pseek = NULL;
    while(ptemp->pnext != NULL)
    {
        if(ptemp->pnext->id == ID)
        {
            pseek = ptemp->pnext;
            return pseek;
        }
        ptemp = ptemp->pnext;
    }
    
    return 0;
}

7.修改节点

int *Change_node(STD *phead,STD ptemp)
{
    STD *pseek = SEEK_node(phead,ptemp.id);
    
    pseek->id = std.id;
    strcpy(pseek->name,std.name);
    pseek->score = std.score;

    return 1;

   
}

2).链表常用函数

(1) malloc

         函数原型:void *_Cdecl malloc(size_t size);

         函数功能:向存储器申请一块内存空间(手动开辟。从堆区开辟,只要我们不释放空间,保存的数据会一直存在,直到main结束自动释放空间为止)

         使用:p = malloc(8);    //向存储器申请一块大小为8个字节的空间,如果成功p里面保存的就是申请后的空间首地址

(2)   calloc

            函数原型:void *_Cdecl calloc(size_t nitems, size_t size);

            函数功能:向存储器申请多块内存空间

            使用:例:p = calloc(3,4);   成功:返回开辟的第一块空间的首地址失败返回NULL

(3) realloc

       函数原型:void *_Cdecl realloc(void *block, size_t size);

       函数功能:修改已经分配的内存空间大小

       函数参数:block:表示需要修改的内存空间首地址  size:修改成多大的内存空间

       函数返回值:成功:返回新空间的首地址  ,失败:NULL

       例:p = realloc(q,20);   //向存储器申请修改空间字节大小,改成20字节,然后把新空间的首地址赋值给p  

注:如果原有空间有数据,新空间比原空间小时会发生数据丢失。

(4)free

函数原型:void _Cdecl free(void *block);

函数功能:手动释放向存储器动态开辟的空间

函数参数:要释放的空间首地址

函数返回值:无

写文章临时手打的程序,未经核验,可能有所出入!

猜你喜欢

转载自blog.csdn.net/qq_45604814/article/details/110450434
今日推荐