链表复习之同学录

本文主要复习链表的基本概念,包括单链表、双向链表和循环链表,并通过实例介绍了如何使用链表来实现一个简单的同学录系统,涵盖了增删查改等操作。通过对链表的理解,深化对数据结构的应用。
摘要由CSDN通过智能技术生成
#include"stdio.h"
#include"stdlib.h"
#include"string.h"

#define LEN sizeof(struct student)//结构体空间大小

typedef struct student  //结构体内容,结点
{
    int num;
    char name[10];
    struct student *next;
}STU;

struct student *create()  //创建链表
{
    STU *p1,*p2;
    STU *head; //头节点
    int n = 0;
    head = NULL; //初始化
    p1 = p2 = (STU*)malloc(LEN);  //分配内存空间
    printf("输入学号和姓名:");
    printf("输入0结束\n");
    scanf("%d,%s",&p1->num,p1->name);
    while(p1->num != 0)
    {
        ++n;
        if(n==1)
            head = p1;
        p2 = p1; //下一个结点
        p1 = (STU*)malloc(LEN);//重新分配空间
        printf("输入学号和姓名:");
        scanf("%d,%s",&p1->num,p1->name);
        p2->next = p1;
    }
    p2->next = NULL;  //尾结点
    return head;
}

int print(STU *head)  //打印
{
    STU *p;
    p = head;
    if(head == NULL)
        printf("NULL");
    else
    {
        do  //遍历
        {
            printf("学号和姓名:");
            printf("%d,%s",p->num,p->name);
            printf("\n");
            p = p->next;
        }while(p!=NULL);  //跳出条件
    }
}

struct student *delete(STU*head)  //删除
{
    printf("输入想删除的学号:");
    STU *p1,*p2; //定义结点
    int index;
    p1 = head;
    if(head==NULL)
        printf("NULL");
    else
    {
        scanf("%d",&index);
        while(p1->num!=index&&p1->next!=NULL)
        {
            p2 = p1;
            p1=p1->next;  //遍历
        }
        if(p1->num==index)
        {
            if(p1 == head)
                head = p1->next; //删除,跳过所删除的结点
            else
                p2 -> next = p1 -> next;
            free(p1);
        }
    }
    return head;
}

struct student *change(STU *head)  //更改
{
    printf("输入想要改的学号:");
    STU *p;
    int index;
    int num;
    char name[10];
    scanf("%d",&index);
    p = (STU*)malloc(LEN);
    if(head == NULL)
        printf("NULL\n");
    else
    {
        p = head;
       while(p->next!=NULL&&p->num!=index)
       {
           p = p->next; //遍历
       }
       if(p->num == index)
       {
            printf("输入新的学号和姓名:");
            p->num = num;
            strcpy(p->name,name);
            scanf("%d,%s",&p->num,p->name); //写入
       }
       else
           printf("没有\n");
    }
    return head;

}


struct student*search(STU*head)   //查询
{
    printf("输入查询的信息:");
    STU *p;
    int index;
    scanf("%d",&index);
    if(head == NULL)
        printf("NULL");
    else
    {
        p = head;
        while(p->next!=NULL&&p->num!=index)
        {
            p = p->next;
        }
        if(p->num==index) //找到所更新的节点
        {
            printf("%d,%s",p->num,p->name);
            printf("\n");
        }
    }
    return head;
}


struct student*add(STU*head)  //插入
{
    printf("输入在那位学号之后增加:");
    STU*p,*p1;
    int num;
    char name[10];
    int index;
    scanf("%d",&index);
    if(head == NULL)
        printf("NULL");
    else
    {
        p = head;
        while(p->next!=NULL&&p->num!=index)
        {
            p = p->next;
        }
        if(p->num==index)
        {
            p1 = (STU*)malloc(LEN);
            p1->num = num;
            strcpy(p1->name,name);
            scanf("%d,%s",&p1->num,p1->name); //写入
            getchar();
            if(p->next==NULL)  //所插入节点位置
            {
                p->next = p1;
                p1->next = NULL;
            }
            else
                {
                    p1->next = p->next;
                    p->next = p1;
                }
        }

    }
    return head;
}







int main()
{
    STU *h;
    printf("\t****欢迎来到通讯录****\n");
	printf("\t	  1.创建		    \n");
	printf("\t	  2.删除			\n");
	printf("\t	  3.更新			\n");
	printf("\t	  4.增加			\n");
	printf("\t	  5.查询		    \n");
	printf("\t	  6.打印		    \n");
	printf("\t	  6.退出		    \n");
	printf("\t**********************\n");
    while(1)
    {
        printf("输入你想要操作:");
        int a;
        scanf("%d",&a);
        switch(a)
        {
            case 1:
                h = create();
                break;
            case 2:
                h = delete(h);
                break;
            case 3:
                h = change(h);
                break;
            case 4:
                h = add(h);
                break;
            case 5:
                search(h);
                break;
            case 6:
                print(h);
                break;
            case 7:
                return 0;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值