c语言 链表

一下是我从一本参考书 看到的代码,大家可以参考:

/*
 1.链表的创建过程是一个动态的创建过程
 链表不是一开始就设定好自身大小的,而是根据节点的多少决定的
 2.mallo()函数
 在内存中动态的分配指定大小的内存空间
 返回一个指针,该指针指向分配的内存空间,出错则返回 NULL
 3.calloc()函数
  void *calloc(unsigned n,unsigned size);
 在内存中动态分配n个长度为size 的连续内存空间爱数组。
 该函数返回一个指针,该指针指向动态分配的连续内存空间,出错则返回 NULL
 4.free()函数
 释放内存空间
 */
#include <stdio.h>
#include <stdlib.h>
//结构体
struct Student
{
    char name[20];
    int number;
    struct Student *pNext;//指向下一个节点的指针
    
};
//定义全局变量,表示链表长度
int iCount;
//定义函数creat,用来创建列表
struct Student* creat()
{
    struct Student *pHead=NULL;//初始化链表头指针为空
    struct Student *pEnd,*pNew;
    iCount=0;//初始化链表长度
    pEnd=pNew=(struct Student *)malloc(sizeof(struct Student));//分配空间
    printf("请输入姓名:\n");
    scanf("%s",pNew->name);
    printf("请输入学号:\n");
    scanf("%d",&pNew->number);
    
    while (pNew->number!=0) {
        iCount++;
        if (iCount==1) {
            pNew->pNext=pHead;
            pEnd=pNew;
            pHead=pNew;
        }
        else
        {
            pNew->pNext=NULL;
            pEnd->pNext=pNew;
            pEnd=pNew;
        }
        pNew=(struct Student *)malloc(sizeof(struct Student));
        printf("请输入姓名:\n");
        scanf("%s",pNew->name);
        printf("请输入学号:\n");
        scanf("%d",&pNew->number);

    }
    free(pNew);
    return pHead;
    
    
}

//输出链表
void show(struct Student *pHead)
{
    struct Student *pTemp;
    int iIndex=1;
    printf("链表有成有%d个",iCount);
    printf("\n");
    pTemp=pHead;
    while (pTemp != NULL) {
        printf("the NO%d member is:\n",iIndex);
        printf("the name is: %s\n",pTemp->name);
        printf("the number is:%d",pTemp->number);
        printf("\n");
        pTemp=pTemp->pNext;
        iIndex++;
        
    }
}
//链表的插入操作
struct Student *Insert(struct Student *pHead)
{
    struct Student *pNew;
    printf("—Insert member at first- \n");
    pNew=(struct Student*)malloc(sizeof(struct Student));
    
    printf("请输入姓名:\n");
    scanf("%s",pNew->name);
    printf("请输入学号:\n");
    scanf("%d",&pNew->number);
    pNew->pNext=pHead;
    iCount++;
    return pHead;
    
}

//链表的删除
void delete(struct Student* pHead,int iIndex)
{
    
    struct Student *pTemp;
    struct Student *pPre;//要删除节点前的节点
    pTemp=pHead;
    pPre=pTemp;
    printf("--delete NO%d member",iIndex);
    for (int i=0; i<iIndex; i++) {
        pPre=pTemp;
        pTemp=pTemp->pNext;
    }
    pPre->pNext=pTemp->pNext;
    free(pTemp);
    iCount--;
    
}

int main(int argc, const char * argv[])
{
    struct Student *pStu;
    pStu=creat();
    pStu=Insert(pStu);
    delete(pStu, 2);
//    printf("%s",pStu->name);
    show(pStu);

  
    return 0;
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值