自学内容网 自学内容网

数据结构 (C语言) 链表

链表

逻辑结构  顺序结构

存储结构  链式存储

优点:不要求大片连续空间,改变容量方便。

可以动态的添加和删除节点

缺点:不方便随机存取,要耗费一定空间存放指针。

链表可以分为三种类型

  • 单向链表:每个节点只有一个指针指向下一个节点,最后一个节点的指针指向NULL。

  • 双向链表:每个节点有两个指针,分别指向上一个节点和下一个节点,可以在O(1)时间内实现向前和向后遍历。

  • 循环链表:在单向或双向链表的基础上,将最后一个节点的指针指向头节点,形成一个环。

链表的种类其实有很多种,按照单双向、带头不带头、循环不循环,一共可以分为8种类型,但最常见就是单向链表和双向链表

节点结构

链表是由一个个节点构成的

单链表

data:数据域,用来存放线性表的一个数据元素

link: 指针域,用来存放一个指针,指针指向下一个节点的开始存储的地址

单链表的第一个结点也称为首结点,它的地址可以通过链表的头指针head
找到,其他结点的地址通过前驱结点的link域名找到,链表的最后一个结点
没有后继,则在link域放一个空指针NULL,图中用"^"表示 

双链表 

data:数据域,用来存放线性表的一个数据元素

prev: 指针域,用来存放一个指针,指针指向上一个节点的开始存储的地址

next: 指针域,用来存放一个指针,指针指向下一个节点的开始存储的地址

代码实现

单链表(指针实现) 

main函数
#include "02.h"

int main()
{
S list = { NULL,0 };
int choose;
STU data;
int index;
while (1)
{
fn1();
printf("请输入选项\n");
scanf(" %d", &choose);
switch ( choose)
{
case 1:
//初始化
List_Init(&list);
break;
case 2:
//追加
printf("请输入追加的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入追加的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入追加的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入追加的学生性别\n");
scanf(" %s", &(data.gender));
List_Append(&list, data);
break;
case 3:
//插入
printf("请选择要插入的地方\n");
scanf(" %d", &index);
printf("请输入插入的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入插入的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入插入的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入插入的学生性别\n");
scanf(" %s", &(data.gender));
List_Insert(&list,index,data );
break;
case 4:
//显示
List_Show(list);
break;
case 5:
//查询
printf("请输入查询的学生学号\n");
scanf(" %d", &(data.stu));
List_Check(list, data.stu);
break;
case 6:
//修改
printf("请输入要修改信息的学生学号\n");
scanf(" %d", &(data.stu));
List_Edit(&list, data.stu);
break;
case 7:
//删除
printf("请输入要删除信息的学生学号\n");
scanf(" %d", &(data.stu));
List_Del(&list, data.stu);
break;
case 8:
//销毁
List_destroy(&list);
break;
case 9:
//退出
return;
default:
break;
}
}

return 0;

}

头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>

#define  MaxSize  100
typedef struct Student
{
char sname[20];
int  stu;
int  age;
char gender[5];
}STU ;

typedef struct Stu
{
STU* list_Oreder;
int length;
}S;





void  fn1();//菜单
void List_Init(S* list); //初始化
void List_Append(S* list, STU data);//追加
void List_Show(S list);//显示
void List_Insert(S* list, int index, STU data);//插入
void List_Check(S list, int stu);//查询
void List_Edit(S* list, int stu);//修改
void List_Del(S* list, int stu); //删除
void List_destroy(S* list);//销毁
 函数部分
#include "02.h"


void  fn1()//菜单
{
    printf("  欢迎使用学生信息系统管理平台 \n");
    printf("* =========================== *\n");
    printf("* 1. 初始化                   *\n");
    printf("* 2. 追加                     *\n");
    printf("* 3. 插入                     *\n");
    printf("* 4. 显示                     *\n");
    printf("* 5. 查询                     *\n");
    printf("* 6. 修改                     *\n");
    printf("* 7. 删除                     *\n");
    printf("* 8. 销毁                     *\n");
    printf("* 9. 退出                     *\n");
    printf("* =========================== *\n");
}


void List_Init(S *list) //初始化
{ 
    list->list_Oreder=(STU*)malloc(sizeof(STU)*MaxSize);
    assert(list->list_Oreder);
    printf("初始化成功!!!\n");
}

void List_Append(S *list,STU data)//追加
{
    if (list->list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }
    list->list_Oreder[list->length] = data;
    list->length++;
    printf("追加成功!!!\n");
}


void List_Show(S list) //显示
{ 
    if (list.list_Oreder==NULL)
    {
        printf("未初始化\n");
        return;
    }

    printf("姓名       学号       年龄        性别\n");
    for (int i = 0; i < list.length; i++)
    {
        printf("%s        ", list.list_Oreder[i].sname);
        printf("%d        ", list.list_Oreder[i].stu);
        printf("%d        ", list.list_Oreder[i].age);
        printf("%s        ", list.list_Oreder[i].gender);
        printf("\n");
    }
}
 //3 1
void List_Insert(S* list, int index, STU data)//插入
{
    if (list->list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }

    if (index > list->length)
    {
        printf("插入位置不合适\n");
        return;
    }
    int ind = index - 1;
    if (ind<0||ind==99)
    {
        printf("插入位置不合适\n");
        return;
    }
    
    for (int i = ind; i < list->length; i++)
    {
        list->list_Oreder[i + 1] = list->list_Oreder[i];
    }
    list->list_Oreder[ind] = data;
    list->length++;
    printf("插入成功!!!\n");

}

void List_Check(S list, int stu)//查询
{
    if (list.list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }
    int flag = 0;
    for (int i = 0; i < list.length; i++)
    {
        if(list.list_Oreder[i].stu==stu)
        {
            flag = 1;
            printf("%s        ", list.list_Oreder[i].sname);
            printf("%d        ", list.list_Oreder[i].stu);
            printf("%d        ", list.list_Oreder[i].age);
            printf("%s        ", list.list_Oreder[i].gender);
            printf("\n");
        }
    }
    if (flag==0)
    {
        printf("未查到该学生\n");
    }

}

void List_Edit(S * list, int stu)//修改
{
    if (list->list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }
    int flag = 0;
    int choose;
    char name[20];
    char sex[20];
    for (int i = 0; i < list->length; i++)
    {
        if (list->list_Oreder[i].stu == stu)
        {
            flag = 1;
           while(1)
           {
               printf("1.姓名   2.年龄   3.学号   4.性别   5.退出");
               scanf(" %d", &choose);
               switch (choose)
               {
               case 1:
                   printf("请输入修改后的学生姓名\n");
                   scanf(" %s", &name);
                   strcpy(list->list_Oreder[i].sname, name);
                   printf("修改成功!!!\n");
                   break;
               case 2:
                   printf("请输入修改后的学生年龄\n");
                   scanf(" %d", &(list->list_Oreder[i].age));
                   printf("修改成功!!!\n");
                   break;
               case 3:
                   printf("请输入修改后的学生学号\n");
                   scanf(" %d", &(list->list_Oreder[i].stu));
                   printf("修改成功!!!\n");
                   break;
               case 4:
                   printf("请输入修改后的学生性别\n");
                   scanf(" %s", &sex);
                   strcpy(list->list_Oreder[i].gender, sex);
                   printf("修改成功!!!\n");
                   break;
               case 5:
                   system("cls");

                   return;
               default:
                   break;
               }
           
           }
        }
    }
    if (flag == 0)
    {
        printf("未查到该学生\n");
    }
}


void List_Del(S * list,  int stu) //删除
{ 
    if (list->list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }
    int flag = 0;
    for (int i = 0; i < list->length; i++)
    {
        if (list->list_Oreder[i].stu == stu)
        {
            flag = 1;
            
            for (int j = i; j < list->length; j++)
            {
                list->list_Oreder[j] = list->list_Oreder[j + 1];
            }
            list->length--;
            printf("删除成功!!!\n");
        }
    }
    if (flag == 0)
    {
        printf("未查到该学生\n");
    }
}


void List_destroy(S *list)//销毁
{
    if (list->list_Oreder == NULL)
    {
        printf("未初始化\n");
        return;
    }
    free(list->list_Oreder);
    list->list_Oreder = NULL;
    printf("销毁成功!!!\n");
}

数组形式

main函数
#include "02.h"
               
int main()
{   
fn();
int choose;
S* list = NULL;
STU data;
int index;
while (1) 
{  
printf("请输入操作的指令数字\n");
scanf(" %d", &choose);
switch (choose)
{
case 1:  
//初始化
 list=List_Init();
break;
case 2:  
//追加
printf("请输入追加的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入追加的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入追加的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入追加的学生性别\n");
scanf(" %s", &(data.gender));
List_Append(list, data);

break;
case 3: 
//插入 从一开始
printf("请输入插入的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入插入的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入插入的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入插入的学生性别\n");
scanf(" %s", &(data.gender));
printf("请输入插入的学生的序号\n");
scanf(" %d", &index);
List_Insertion(list, index, data);
break;
case 4:  
//显示
List_Display(list);
break;
case 5: 
//查询
printf("请输入查询的学生学号\n");
scanf(" %d", &(data.stu));
List_Querying(list,data.stu);
break;
case 6:
//删除
printf("请输入删除学生的学号\n");
scanf(" %d", &(data.stu));
List_Del(list,data.stu);
break;
case 7:

printf("请输入修改的学生的学号\n");
scanf(" %d", &(data.stu));
List_edit(list, data.stu);
fn();
break;
case 8:
//销毁
List_destruction(&list);
break;
case 9:  
//退出
return 0;
default:
break;
}
}
return 0;
}
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include "string.h"
#include "Windows.h"
void  fn();

typedef struct Student
{
char sname[20];
int age;
int stu;
char gender[5];
}STU;

typedef struct Stu
{
STU stu_Arr[100];
int length;
}S;



S* List_Init();//初始化
void  List_Append(S* list, STU data);//追加
void List_Insertion(S* list, int index, STU data);//插入
void  List_Display(S* list);//显示
void  List_Querying(S* list, int stu);//查询
void List_Del(S* list, int stu);//删除
void List_edit(S* list, int stu);//修改
void List_destruction(S * * list);//销毁

函数部分
#include "02.h"

void  fn()
{
    printf("  欢迎使用学生信息系统管理平台 \n");
    printf("* =========================== *\n");
    printf("* 1. 初始化                   *\n");
    printf("* 2. 追加                     *\n");
    printf("* 3. 插入                     *\n");
    printf("* 4. 显示                     *\n");
    printf("* 5. 查询                     *\n");
    printf("* 6. 删除                     *\n");
    printf("* 7. 修改                     *\n");
    printf("* 8. 销毁                     *\n");
    printf("* 9. 退出                     *\n");
    printf("* =========================== *\n");
}



 S* List_Init()
{
     system("cls");
     fn();
    S* list = (S*)malloc(sizeof(S));
     if (list==NULL)
     {
         printf("初始化失败\n");
         return NULL;
     }
     memset(list, 0, sizeof(S));
     printf("初始化成功!!!\n");
     return list;
}

 void  List_Append(S* list,STU data)
 {
     system("cls");
     fn();
     if (list == NULL)
     {
         printf("未初始化\n");
         return;
     }
     list->stu_Arr[list->length] = data;
     list->length++;
     printf("添加成功!!!\n");
 }

 void  List_Display(S* list)
 {
     system("cls");
     fn();
     if (list == NULL)
     {
         printf("未初始化\n");
         return;
     }
     printf("姓名       学号       年龄        性别\n");
    for (int i = 0; i < list->length; i++)
    {
        printf("%s        ", list->stu_Arr[i].sname);
        printf("%d        ", list->stu_Arr[i].stu);
        printf("%d        ", list->stu_Arr[i].age);
        printf("%s        ", list->stu_Arr[i].gender);
        printf("\n");
    }
 }
    //1 2  3  4  5  6  7  8
 void List_Insertion(S* list,int index,STU data)
 {
     system("cls");
     fn();
     if (list == NULL)
     {
         printf("未初始化\n");
         return;
     }
     index -= 1;
     for (int i = list->length-1; i >= index ; i--)
     {
         list->stu_Arr[i+1] = list->stu_Arr[i];
     }
     list->stu_Arr[index] = data;
     list->length++;
     printf("添加成功!!!\n");
 }

void  List_Querying(S* list, int stu)
{
    system("cls");
    fn();
    if (list == NULL)
    {
        printf("未初始化\n");
        return;
    }
    if (list->length == 0)
    {
        printf("不存在学生信息");
        return;
    }
    int flag = 0;
    printf("姓名       学号       年龄        性别\n");
    for (int i = 0; i < list->length; i++)
    {
        
        if (list->stu_Arr[i].stu==stu)
        {
            printf("%s        ", list->stu_Arr[i].sname);
            printf("%d        ", list->stu_Arr[i].stu);
            printf("%d        ", list->stu_Arr[i].age);
            printf("%s        ", list->stu_Arr[i].gender);
            flag = 1;
            printf("\n");
        }
       
        
    }
    if (flag==0)
    {
        printf("不存在此学生\n");
    }
}

//1  2  3  4  5  6  7  8
void List_Del(S* list, int stu)
{
    system("cls");
    fn();
    if (list == NULL)
    {
        printf("未初始化\n");
        return;
    }
    if (list->length == 0)
    {
        printf("不存在学生信息");
        return;
    }
    int flag = 0;
    for (int i = stu-1; i < list->length; i++)
    {
        if (list->stu_Arr[i].stu==stu)
        {
            list->stu_Arr[i] = list->stu_Arr[i + 1];
            flag = 1;
          
        }
    }
    if (flag == 0)
    {
        printf("不存在此学生\n");
    }
    else
    {
        list->length--;
        printf("删除成功!!!\n");
    }
   
}

void List_edit(S* list,int stu)
{
    int choose;
    char name[20];
    char sex[5];
    int flag=0;
    system("cls");

    if (list == NULL)
    {
        printf("未初始化\n");
        return;
    }
    if (list->length == 0)
    {
        printf("不存在学生信息\n");
        return;
    }
     
         for (int i = 0; i < list->length; i++)
         {
             if(list->stu_Arr[i].stu==stu)
             {  
                 flag = 1;
                 while(1)
                 {
                     printf("1.姓名   2.年龄  3.学号  4.性别\n请选择要修改的信息\n");
                     scanf(" %d", &choose);
                 switch (choose)
                 {
                 case 1:
                     printf("请输入修改后的学生姓名\n");
                     scanf(" %s",&name);
                     strcpy(list->stu_Arr[i].sname,name);
                     break;
                 case 2:
                     printf("请输入修改后的学生年龄\n");
                     scanf(" %d", &(list->stu_Arr[i].age));
                     break;
                 case 3:
                     printf("请输入修改后的学生学号\n");
                     scanf(" %d", &(list->stu_Arr[i].stu));
                     break;
                 case 4:
                     printf("请输入修改后的学生性别\n");
                     scanf(" %s",&sex );
                     strcpy(list->stu_Arr[i].gender,sex);
                     break;
                 case 5:
                     system("cls");
                     
                     return;
                 default:
                     break;
                 }
             }
         }
     
     }
         if (flag==0)
         {
             printf("未查到该学生\n\n");
         }
}



void List_destruction(S**list)
{
    system("cls");
    fn();
    free(*list);
    *list = NULL;
    printf("销毁成功!!!\n");
}

双链表(带头,循环)

main函数
#include "public.h"


int main()
{
int  choose;
STU data;
LH * LinkHead=NULL;
int index;
while (1)
{
print_memn();
printf("请输入选项\n");
scanf(" %d", &choose);
switch (choose)
{
case 1:
//初始化
LinkHead=Link_Init();
break;
case 2:
//打印
Link_show(LinkHead);
break;
case 3:
//头插
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Head_insert(LinkHead,data);
break;
case 4:
//尾插
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Tail_Insert(LinkHead,data);
break;
case 5:
//头删
Head_Del(LinkHead);
break;
case 6:
//尾删
Tail_Del(LinkHead);
break;
case 7:
//查找
printf("请输入要查找的学生学号\n");
scanf(" %d", &(data.stu));
Link_search(LinkHead, data.stu);
break;
case 8:
//中间删
printf("请输入要删除学生信息的学号\n");
scanf(" %d", &(data.stu));
Middle_Del(LinkHead,data.stu);
break;
case 9:
//中间插
printf("请输入要插到那个学生的后面的(学号)\n");
scanf(" %d", &index);
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Middle_Insert(LinkHead, data,index);
break;
case 10:
//销毁
Destory_Link(&LinkHead);
break;
case 11:
//退出
return;
default:
break;
}
}
return 0;
}
 头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "assert.h"
#include "Windows.h"


#define maxSize 100
typedef struct 
{
char sname[20];
int stu;
int age;
char gender[5];
}STU;

typedef struct ListHead
{
STU data;
 structListHead* next;
 struct ListHead* before;
}LH;


void print_memn();//菜单
LH* Link_Init();//初始化
void  Link_show(LH* LinkHead);//打印
void Head_insert(LH* LinkHead, STU data);//头插
void Tail_Insert(LH* LinkHead, STU data);//尾插
void Head_Del(LH* LinkHead);//头删
void Tail_Del(LH* LinkHead);//尾删
void Link_search(LH* LinkHead, int stu);//查找
void Destory_Link(LH** LinkHead);//销毁
函数部分
#include "public.h"

void print_memn()//菜单
{
    printf("  欢迎使用学生信息系统管理平台 \n");
    printf("* =========================== *\n");
    printf("* 1. 初始化                   *\n");
    printf("* 2. 打印                     *\n");
    printf("* 3. 头插                     *\n");
    printf("* 4. 尾插                     *\n");
    printf("* 5. 头删                     *\n");
    printf("* 6. 尾删                     *\n");
    printf("* 7. 查找                     *\n");
    printf("* 8. 中间删                   *\n");
    printf("* 9. 中间插                   *\n");
    printf("* 10.销毁                     *\n");
    printf("* 11.退出                     *\n");
    printf("* =========================== *\n");
}

LH * Link_Init()//初始化
{
    LH* LinkHead = (LH*)malloc(sizeof(LH));
    LinkHead->before = LinkHead;
    LinkHead->next = LinkHead;
    system("cls");
    printf("  初始化成功!!!\n\n");
    return LinkHead;
}

void  Link_show(LH* LinkHead)//打印
{
    if (LinkHead==NULL)
    {
        system("cls");
        printf("请先初始化\n\n");
        return;
    }
    if(LinkHead->next==LinkHead)
    {
        system("cls");
        printf("  没有数据\n\n");
        return;
    }
    LH* temp = LinkHead->next;
    
    system("cls");
    printf("  学号   姓名   年龄   性别\n");
    while(temp!=LinkHead)
    {
       
        printf("  %d   %s   %d   %s\n",temp->data.stu,temp->data.sname,temp->data.age,temp->data.gender);
        temp = temp->next;
    }
}
    

void Head_insert(LH* LinkHead,STU data)//头插
{
    if (LinkHead == NULL)
    {
        system("cls");
        printf("请先初始化\n\n");
        return;
    }
    LH* temp = (LH*)malloc(sizeof(LH));
    temp->data = data;
    temp->next = LinkHead->next;
    LinkHead->next->before = temp;
    LinkHead->next = temp;
    temp->before = LinkHead;
    system("cls");
    printf("  插入成功\n\n");
} 


 void Tail_Insert(LH* LinkHead,STU data)//尾插
 {
     if (LinkHead == NULL)
     {
         system("cls");
         printf("请先初始化\n\n");
         return;
     }
     LH* temp = (LH*)malloc(sizeof(LH));
     temp->data = data;
     LH* temp1 = LinkHead;
     while(LinkHead->next!=temp1)
     {
         LinkHead = LinkHead->next;
       
     }
     temp->next = temp1;
     temp1->before = temp;
     temp->before = LinkHead;
     LinkHead->next = temp;
     system("cls");
     printf("  插入成功\n\n");
 }

 void Head_Del(LH *LinkHead)//头删
 {
     if (LinkHead == NULL)
     {
         system("cls");
         printf("请先初始化\n\n");
         return;
     }
     if (LinkHead->next == LinkHead)
     {
         system("cls");
         printf("  没有数据\n\n");
         return;
     }
     LH* temp = LinkHead->next;
     LinkHead->next->next->before = LinkHead;
     LinkHead->next = LinkHead->next->next;
     free(temp);
     system("cls");
     printf("  头删成功\n\n");
 }

 void Tail_Del(LH* LinkHead)//尾删
 {
     if (LinkHead == NULL)
     {
         system("cls");
         printf("请先初始化\n\n");
         return;
     }
     if (LinkHead->next == LinkHead)
     {
         system("cls");
         printf("  没有数据\n\n");
         return;
     }
     LH* temp1 = LinkHead;
     while (LinkHead->next != temp1)
     {
         LinkHead = LinkHead->next;
     }
     LinkHead->before->next = temp1;
     temp1->before = LinkHead->before;
     free(LinkHead);
     system("cls");
     printf("  尾删成功\n\n");

 }

 void Link_search(LH* LinkHead, int stu)//查找
 {
     if (LinkHead == NULL)
     {
         system("cls");
         printf("请先初始化\n\n");
         return;
     }
     if (LinkHead->next == LinkHead)
     {
         system("cls");
         printf("  没有数据\n\n");
         return;
     }
     LH* temp = LinkHead->next;
     while(temp!=LinkHead)
     {
         if (temp->data.stu==stu)
         {   
             system("cls");
             printf("  %d   %s   %d   %s\n\n", temp->data.stu, temp->data.sname, temp->data.age, temp->data.gender);
             return;
         }
         else
         {
             temp = temp->next;
         }
     }
     system("cls");
     printf("  未找到该学生!!!\n\n");
 }


  void Middle_Del(LH* LinkHead, int stu)//随机删
  {
      if (LinkHead == NULL)
      {
          system("cls");
          printf("请先初始化\n\n");
          return;
      }
      if (LinkHead->next == LinkHead)
      {
          system("cls");
          printf("  没有数据\n\n");
          return;
      }
      LH* temp = LinkHead->next;
      while (temp != LinkHead)
      {
          if (temp->data.stu == stu)
          {
              temp->before->next = temp->next;
              temp->next->before = temp->before;
              free(temp);
              system("cls");
              printf("  删除成功\n\n");
              return;
          }
          else
          {
              temp = temp->next;
          }
      }
      system("cls");
      printf("  未找到该学生!!!\n\n");
  }


  void Middle_Insert(LH* LinkHead, STU data,int stu)//随机插
  {
      if (LinkHead == NULL)
      {
          system("cls");
          printf("请先初始化\n\n");
          return;
      }

      LH* temp1 = (LH*)malloc(sizeof(LH));
      temp1->data = data;
      LH* temp = LinkHead->next;
      while (temp != LinkHead)
      {
          if (temp->data.stu == stu)
          {
              temp->next->before = temp1;
              temp1->next = temp->next;
              temp->next = temp1;
              temp1->before = temp;
              system("cls");
              printf("  插入成功\n\n");
              return;
          }
          else
          {
              temp = temp->next;
          }
      }
      system("cls");
      printf("  未找到该学生!!!\n\n");
  
  }

  void Destory_Link(LH** LinkHead)//销毁
  {
      if (LinkHead == NULL)
      {
          system("cls");
          printf("请先初始化\n\n");
          return;
      }

      LH* temp = (*LinkHead)->next;
      LH* temp1 = NULL;
      while(temp!= (*LinkHead)->next)
      {
          temp1 = temp->next;
          free(temp);
          temp = temp1;
         
      }
      free(*LinkHead);
      *LinkHead = NULL;
      printf("  销毁完成\n\n");
  }

 注意

传值和传址的区别

传值

  如果函数中写的是结构体类型的变量,相当于是定义了一个新的变量
    此时是把main函数中的stu中的数据,传递给了method函数,并把stu中的数据赋给了新的变量st
    我们在函数中,仅仅是修改了st中的值,对于main函数中stu的值是没有修改的

传址

    如果要在函数中修改stu的值,此时就不要定义新的变量了
    直接接受stu的内存地址,通过内存地址就可以修改stu中的数据了        //指针


原文地址:https://blog.csdn.net/2403_89181725/article/details/145219346

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!