(C语言)带头结点单链表的基本操作

本文详细介绍了使用C语言实现单链表的创建、头插法、尾插法、插入(指定位置、指定值前后)、删除以及查询功能的代码示例,是数据结构学习者复习C语言链表操作的实用参考。
摘要由CSDN通过智能技术生成
前言:
本文为本人复习数据结构代码的c语言学习笔记。链表的题目中许多都会用到基本操作,于是总结如下。

1.定义

typedef struct StudentNode {
    int num;//学号
    char name[100];//姓名
    struct StudentNode *next;//指针域
}StudentNode,*StudentLinkedList;

2.建立

(1)头插法创建单链表

void Create(StudentLinkedList Head) {//传入一个头指针
    int num;char nam[20];
    StudentNode *r;//尾指针
    r = Head;//Head和r都指向头结点
    while(1) {//学号大于0进入循环
        printf("请输入姓名:");
        scanf("%s",&nam);
        printf("请输入学号:");
        scanf("%d",&num);
        if(num < 0) {
            break;
        }
        StudentNode *s = (StudentNode *)malloc(sizeof(StudentNode));
        s->num = num;
        strcpy(s->name,nam);
         //头插法创建链表
        s->next = Head->next;
        Head->next = s; 
    }
}

运行 :

(2)尾插法创建单链表

void Create(StudentLinkedList Head) {//传入一个头指针
    int num;char nam[20];
    StudentNode *r;//尾指针
    r = Head;//Head和r都指向头结点
    while(1) {//学号大于0进入循环
        printf("请输入姓名:");
        scanf("%s",&nam);
        printf("请输入学号:");
        scanf("%d",&num);
        if(num < 0) {
            break;
        }
        StudentNode *s = (StudentNode *)malloc(sizeof(StudentNode));
        s->num = num;
        strcpy(s->name,nam);
        //尾插法创建单链表
        r->next = s;
        r = s;
    }
    r->next = NULL;//链表尾结点置空
}

运行 : 

3.打印

void PrintList(StudentLinkedList Head) {
    //遍历单链表
    StudentNode *s = Head->next;
    while (s != NULL)
    {
        printf("姓名:%s  学号%d\n",s->name,s->num);
        s = s->next;
    }
    
}

4.插入

(1)头插

//头插
void HeadInsert(StudentLinkedList Head) {
    int num;char nam[20];
    StudentNode *s = (StudentNode*)malloc(sizeof(StudentNode));
    printf("请输入要插入学生的学号:");
    scanf("%d",&num);
    s->num = num;
    printf("请输入要插入学生的姓名:");
    scanf("%s",nam);
    strcpy(s->name,nam);
    //指针链接
    s->next = Head->next;//带头结点
    Head->next = s;
}

运行 : 

(2)尾插

//尾插
void RearInsert(StudentLinkedList Head) {
    int num;char nam[20];StudentNode *rear = NULL,*s;//尾指针
    s = Head->next;
    //找到单链表尾部
    while (s != NULL){
        if (s->next == NULL){
            rear = s;//rear指向表尾节点
        }
        s = s->next;
    }
    
    //插入新结点
    s = (StudentNode*)malloc(sizeof(StudentNode));
    printf("请输入要插入学生的学号:");
    scanf("%d",&num);
    s->num = num;
    printf("请输入要插入学生的姓名:");
    scanf("%s",nam);
    strcpy(s->name,nam);
    //指针链接
    rear->next = s;
    rear = s;
    rear->next = NULL;//表尾结点next域置空
}

运行 :

(3)指定位置插入元素

(3.1)在第i个位置插入

//1.在第i个位置插入
void Insert1(StudentLinkedList Head,int i) {
    int num;char nam[20];
    //寻找单链表的第i-1个位置
    StudentNode *s = Head->next;
    int count = 0;
    while(s != NULL) {
       count++;
       if (count == i-1){//找到第i-1个元素
        break;
       }  
       s = s->next;
    }
    //插入元素
    StudentNode *p= (StudentNode*)malloc(sizeof(StudentNode));
    printf("请输入要插入学生的学号:");
    scanf("%d",&num);
    p->num = num;
    printf("请输入要插入学生的姓名:");
    scanf("%s",nam);
    strcpy(p->name,nam);
    //指针链接
    p->next = s->next;
    s->next = p;
}

运行 :(i = 2) 

 

(3.2)在指定了值的元素的前面或后面插入

//2.在指定了值的元素的前面或后面插入
void Insert2(StudentLinkedList Head,int k) {//k为学号
    //查找学号为k的元素
    int num;char nam[20];
    //寻找单链表的第i-1个位置
    StudentNode *s = Head->next;
    while(s->num != k) { 
       s = s->next;
    }
     //插入元素
    StudentNode *p= (StudentNode*)malloc(sizeof(StudentNode));
    printf("请输入要插入学生的学号:");
    scanf("%d",&num);
    p->num = num;
    printf("请输入要插入学生的姓名:");
    scanf("%s",nam);
    strcpy(p->name,nam);
    //指针链接
    p->next = s->next;
    s->next = p;
    
}

运行 :(在学号为23的学生后面插入新元素)

5.删除

void delete(StudentLinkedList Head,int pos) { //删除第pos个结点
    StudentNode *p,*q;
    p = Head->next;int count = 0;
    while (p != NULL ){
        count++;
        if (count == pos - 1){
            break;//找到要删除结点的前一个结点
        }
        
       p = p->next;
    }
    //指针链接
    q = p->next;//q指向要删除的结点
    p->next = q->next;//链接要删除的结点的后面结点
    free(q);
}

 运行 :(pos = 2)

6.查询

//单链表的查询
StudentNode* query(StudentLinkedList Head,char name[]) {//查找指定名字的学生,并返回
    StudentNode *p = Head->next;//遍历指针
    if (!p){//p空
        printf("查无此人。");
        return p; 
    }
    while (p != NULL){
        if (strcmp(p->name ,name) == 0){
            return p;
        }
        p = p->next;   
    }
}

运行 : 

(情况一)

(情况二)

借鉴:https://blog.csdn.net/Czc1357618897/article/details/121619656?spm=1001.2014.3001.5506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值