数据结构-链表结构

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//定义一个结构体
struct Student{
char name[20];
int number;
struct Student *next;
};

int main(){
    //函数声明
    struct Student * createLink();
    void printLink(struct Student * pHead);
    struct Student * insertLink(struct Student * pHead);
    void deleteLink(struct Student * pHead);
    void menu(struct Student * pHead);
    //定义一个指针指向结构体的指针变量,为改结构体的头节点
    struct Student * pHead=NULL;
    menu(pHead);
}

void menu(struct Student * pHead){
    int i;
    printf("1.创建链表 2.为链表增加节点 3.删除链表的节点 4.打印链表\n");
    printf("请输入操作指令:");
    scanf("%d",&i);
    switch(i){
    case 1:
        pHead=createLink();
        printf("操作成功\n");
        menu(pHead);
        break;
    case 2:
        pHead=insertLink(pHead);
        printf("操作成功\n");
        menu(pHead);
        break;
    case 3:
        deleteLink(pHead);
        printf("操作成功\n");
        menu(pHead);
        break;
    case 4:
        printLink(pHead);
        printf("操作成功\n");
        menu(pHead);
        break;
    default:
        printf("输入的参数不合法!\n");
        menu(pHead);
        break;
    }
}


//创建链表
struct Student * createLink(){
    //定义一个指向结构体的指针变量
    struct Student * pHead=NULL;
    //定义两个指向结构体的指针
    struct Student *pOld,*pNew;
    //分配一块内存,然后让两个指针指向它
    pHead=pNew=pOld=(struct Student*)malloc(sizeof(struct Student));
    printf("请输入一个学生的名字:");
    scanf("%s",&pNew->name);
    printf("请输入一个学生的学号:");
    scanf("%d",&pNew->number);
    while(pNew->number!=0){
        pOld=pNew;        //将旧的指针指向新的指针
        pNew=(struct Student*)malloc(sizeof(struct Student));
        printf("请输入一个学生的名字:");
        scanf("%s",&pNew->name);
        printf("请输入一个学生的学号:");
        scanf("%d",&pNew->number);
        pOld->next=pNew;
    }
    pOld->next=NULL;
    free(pNew);
    return pHead;
}

//打印链表中的元素
void printLink(struct Student * pHead){
    while(1){
        if(pHead!=NULL){
            printf("学生的姓名为:%s,学生的学号为%d\n",pHead->name,pHead->number);
            pHead=pHead->next;        //将指针指向下一个节点
        }else{
            break;
        }
    }
}

//插入数据到链表中,pHead表示要插入的链表的头结点
struct Student * insertLink(struct Student * pHead){
    //新建一个节点
    struct Student * pNew,*pTemp;
    pNew=(struct Student*)malloc(sizeof(struct Student));
    printf("请输入姓名:");
    scanf("%s",&pNew->name);
    printf("请输入学号:");
    scanf("%s",&pNew->number);

    pTemp=pHead->next;        //原来的pHead的节点的下一个节点的地址
    pHead->next=pNew;
    pNew->next=pTemp;
    return pHead;
}

//删除链表,pHead为头结点指针,index为要删除的第几个节点
void deleteLink(struct Student * pHead){
    int index;
    int i;
    struct Student * pTemp,*pTemp2,*pTemp3;
    printf("请输入需要删除的节点的索引号:");
    scanf("%d",&index);
    pTemp2=pHead;
    //删除第二个节点
    for(i=0;i<index-1;i++){
        pTemp3=pTemp2;
        pTemp=pTemp2->next;        //为第二个节点的指针
        pTemp2=pTemp;
    }
    pTemp3->next=pTemp->next;
    free(pTemp);
}





猜你喜欢

转载自blog.csdn.net/wumanxin2018/article/details/78753888