单链表的基本操作

本文深入探讨了单链表的基本操作,包括插入、删除、遍历等核心概念,并通过实例解析了实现细节,有助于理解链表数据结构及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2016年7月14日16:22:48
    单链表的基本运算有:
    1.单链表的创建;
    2.单链表的插入;
    3.判断单链表是否为空;
    4.求单链表的长度;
    5.根据内容查找元素;
    6.根据序号查找单链表;
    7.单链表的插入;
    8.单链表的删除;
    9.单链表的遍历;
    10.销毁单链表;
#include<stdio.h>

//学生信息结构体类型定义
typedef  struct 
{
    long num;
    char name[10];
    float score;
}STUDNET;

//链表结构体类型的定义
typedef struct node
{
    STUDNET  data;
    struct node * pNext;
}linkList ;

//函数前置声明
void  showMenu(void);
void  initList(linkList * pHead);
int   isEmpty(linkList * pHead);
void  inputInfor(linkList * pNew);
linkList * createList(linkList * pHead, int len );
linkList * insertNode(linkList * pHead,linkList * cur,int pos);
linkList * deleteNode(linkList * pHead,int  pos ,linkList * pDelete)
void traverseList(linkList * pHead);



//展示系统菜单
void showMenu(void)
{
    printf("___________________________________________\n");
    printf("         欢迎使用学生成绩管理系统\n");
    printf("\t    【1】创建学生信息\n");
    printf("\t    【2】插入学生信息\n");
    printf("\t    【3】删除学生信息\n");
    printf("\t    【4】显示学生信息\n");
    printf("\t    【5】退出系统\n");
    printf("___________________________________________\n");
    return;
}

//单链表的初始化
void initLinkList(linkList * pHead)
{
    pHead = (linkList *)malloc(sizeof(linkList));
    if(NULL == pHead)
    {
        printf("动态内存分配失败!\n");
        return ;
    }
    pHead->pNext = NULL;
}

//判断链表是否为空
int  isEmpty(linkList * pHead)
{
    if(NULL == pHead->pNext)
        return 1;
    else
        return 0;
}

//完成学生信息的输入
void  inputInfor(linkList * pNew)
{
    printf("学号=");
    scanf("%d",&pNew->data.num);
    printf("姓名=");
    scanf("%s",pNew->data.name);
    printf("分数=");
    scanf("%d",&pNew->data.score);
    return;
}

//创建单链表
linkList * createList(linkList * pHead, int len )
{
    linkList * pNew, * pTail;
    int i;
    pTail = pHead;
    for(i = 0;i<len;i++)
    {
        pNew = (linkList * )malloc(sizeof(linkList));
        if(NULL == pNew)
        {
            printf("动态内存分配失败!\n");
            return  NULL;
        }
        inputInfor(pNew);
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    return pHead;
}

//学生结点的插入
linkList * insertNode(linkList * pHead,linkList * cur,int pos)
{

    linkList * prev = pHead;
    int i;
    while(pos<1||pos>pHead->data.num+1)
    {
        return NULL;
    }
    for(i = 1;i<pos;i++)
    {
        prev = prev->pNext;
    }
    if(prev->pNext==NULL)
    {
        prev->pNext = cur;
        cur->pNext = NULL;
        pHead->data.num ++;
    }
    else
    {
        cur->pNext = prev ->pNext;
        prev->pNext = cur;
        pHead->data.num++;
    }   
    return pHead;
}

//学生结点的删除
linkList * deleteNode(linkList * pHead,int  pos ,linkList * pDelete)
{
    linkList * prev;
    linkList * cur;
    int i;
    prev = pHead;
    if(NULL == pHead->pNext)
    {
        printf("链表为空,不能删除元素!\n");
        return NULL;
    }
    while(pos<1||pos>pHead->data.num)
    {
        return NULL;
    }
    for(i = 1;i<pos;i++)
    {
        prev = prev->pNext;
    }
    cur = prev->pNext;
    if(NULL == cur->pNext )
    {
        prev->pNext = NULL;
        *pDelete = *cur;
        free(cur);
        pHead->data.num--;
    }
    else
    {
        prev->pNext = cur->pNext;
        *pDelete = *cur;
        free(cur);
        pHead->data.num--;
    }
    return pHead;
}

//链表的遍历
void traverseList(linkList * pHead)
{
    int i = 0;
    linkList * p = NULL;
    p = pHead->pNext;
    printf("        学号   姓名   分数 \n");
    if(NULL == p)
    {
        printf("链表为空!\n");
    }
    else
    {
        while(NULL != p)
        {
            printf("第%d个学生   ",i+1);
            printf("%-7ld%-7s%-6.2f\n",p->data.num,p->data.name,p->data.score);
            p = p->pNext;
            i++;
        }
    }
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值