C语言 单向链表

1、单向链表的定义

struct student
{
    char name[10];
    float score;
    struct student *next;
};

next作为同类型指针,指向与它所在节点一样的节点。

2、单向链表的基本操作

1)建立链表

int main()
{
    /*定义结构指针,pnew指向新节点,head指向头节点,tail指向尾节点*/
    struct student *pnew, *head, * ptail;
    /*
            动态分配库函数malloc,分配长度为sizeof(struct student)的存储空间,函数返回分配到空间的起始地址,
            指向的类型为强制类型转换后的struct student*.
            malloc的头文件stdlib.h
     */
    pnew = (struct student*) malloc(sizeof(struct student));
    /*
            空链表中建立头节点操作。
     */
    scanf("%s%f",pnew->name,&pnew->score);  head = pnew;    ptail = pnew;
    /*
            向现有链表中添加新节点。
     */

    pnew = (struct student*) malloc(sizeof(struct student));
    scanf("%s%f",pnew->name,&pnew->score);
    ptail->next = pnew;
    ptail = pnew;
    /*      将末节点指向下一节点的成员赋值为NULL    */
    ptail->next = NULL;
}
/*定义创建函数create,建立一个有n个节点的单向链表*/

struct student *create(int n)
{
    struct student *pnew, *head, *ptail;
    int i;
    pnew = (struct student*) malloc(sizeof(struct student));
    scanf("%s%f",pnew->name, &pnew->score);
    head = ptail = pnew;
    for (i = 1; i < n; i++)
    {
        pnew = (struct student*) malloc(sizeof(struct student));
        scanf("%s%f",pnew->name, &pnew->score);
        ptail->next = pnew;
        ptail = pnew;
    }
    ptail->next = NULL;
    return head;
}

2)遍历链表

/*定义输出链表节点信息函数print,形参head为链表头指针*/

void print(struct student *head)
{
    struct student *p = head;
    while (p != NULL)
    {
        printf("%s  %.1f\n",p->name, p->score);
        p = p->next;
    }
}

3)在链表中插入节点

/*定义函数insert,在有序链表中插入一个节点,使链表按score成员从大到小排列节点*/

struct student* insert(struct student *head)
{
    struct student *p = head, *pnew, *pold = head;
    pnew = (struct student*) malloc(sizeof(struct student));
    scanf("%s%f",pnew->name,&pnew->score);
    if (pnew->score > head->score)  //当新结点score值大于头结点时,将新结点指向头节点,再作为头节点
    {
        pnew->next = head;
        head = pnew;
    }
    else
    {
        while(p != NULL && pnew->score < p->score)
        {
            pold = p;
            p = p->next;
        }

        pold->next = pnew;
        pnew->next = p;
    }
    return head;
}

4)在链表中删除节点

/*定义函数pdelete,在链表中删除所有成员score值大于等于grade值的节点。*/

struct student *pdelete(struct student *head, int grade)
{
    struct student *p,*pold;

    p = head;
    while (head != NULL && head->score >= grade)    //当头结点为所删除节点时,将头结点指向下一节点,并释放其空间。
    {
        head = head->next;
        free(p);
        p = head;
    }
    if (head == NULL) return head;
    p = head->next;
    pold = head;        //pold指向刚才已检查过的结点。
    while (p != NULL)
    {
        if(p->score >= grade)
        {
            pold->next = p->next;
            free(p);
            p = pold->next;
        }
        else
        {
            pold = p;
            p = p->next;
        }
    }
    return head;
}

题目1

/*输入n个学生的信息(姓名,成绩),根据成绩数据建立一个链表,使链表中的节点按成绩从高到低连接起来。*/
#include <stdio.h>
#include <stdlib.h>

struct student
{
    char name[10];
    float score;
    struct student *next;
};

struct student* insert(struct student *);
void print(struct student *);

int main()
{
    struct student *head;
    int i, n;
    scanf("%d",&n);
    head = (struct student*) malloc(sizeof(struct student));
    scanf("%s%f",head->name, &head->score);
    head->next = NULL;
    for (i = 1;i < n; i++)
    {
        head = insert(head);
    }
    print(head);
    return 0;
}

题目2

/*输入n个学生的信息(姓名、成绩),输出所有学生的节点信息,删除链表中所有不参加补考同学的节点,最后再输出要补考学生的节点信息*/
#include <stdio.h>
#include <stdlib.h>

struct student
{
    char name[10];
    float score;
    struct student *next;
};

struct student* insert(struct student *);
void print(struct student *);
struct student *create(int );
struct student *pdelete(struct student *, int );

int main()
{
    struct student *head;
    int n;
    scanf("%d",&n);
    head = create(n);
    print(head);
    head = pdelete(head,60);
    print(head);
    return 0;
}

单链表冒泡排序

修改数据,或者 先全部修改,再还原指针(这里用第二种方法)

    pi = head;
    while (pi->next != NULL)
    {
        pj = pi->next;
        while (pj != NULL)
        {
            if (pi->date > pj->date)
            {
                t = *pi;
                *pi = *pj;
                *pj = t;
                t.next = pi->next;
                pi->next = pj->next;
                pj->next = t.next;
            }
            pj = pj->next;
        }
        pi = pi->next;
    }

原文地址:https://www.cnblogs.com/liumengyue/p/9932274.html

时间: 2024-09-28 08:45:18

C语言 单向链表的相关文章

c语言单向链表

一.链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素:……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束.        链表的各

C语言通讯录系统——C语言单向链表实现

实现的通讯录功能有:查看通讯录.添加联系人.删除联系人.查询联系人.保存并退出. 通过txt文件保存和读取通讯录数据. #include <stdio.h> #include <string.h> #include <Windows.h> void showMenu(); void initL(); void addPerson(); void displayPersons(); void deletePerson(); void saveList(); void se

C语言之字符单向链表

/* * @Author: suifengtec * @Date:   2017-09-02 16:06:33 * @Last Modified by:   suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符单向链表 gcc -o a.exe main.c && a  */ #include <stdio.h> #include <stdlib.h> #include <stdbool

写给过去的自己-No.1-数据结构篇-单向链表C语言的实现

过去的自己,你好.     今天我来教你单向链表,不知道你何时会看到这篇文章,也不知道你此刻对C语言的掌握,我会尽可能讲解细一点.     讲链表之前我先讲一下数组.相信你不管怎样肯定用过数组对吧,数组就是一种数据的组织形式,特点是所有的数据在逻辑上是顺序摆放的,通过数组名和数组下标 就可以找到某个元素,而且在内存中存放的物理地址也是连续的,定义数组时,一旦中括号中的数字确定了,数组中元素个数也就确定了.那么问题来了,因为数组 的大小需要提前确定,所以定义数组时必须统计好程序中用了多少元素,用多

C语言反转单向链表的代码

学习过程中中,把内容过程中常用的内容片段做个珍藏,下边内容段是关于C语言反转单向链表的内容,应该能对大伙有较大用处. #include "stdafx.h" enum{N = 3};class Node{public:int var;Node(int i):pNext(NULL), var(i){}}; {if(pHead->pNext->pNext != NULL)helper(pHead->pNext, reverseHead);elsereverseHead =

C语言之单向链表

1,单向链简洁.单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点:?列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: 2,例子要求:根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入.删除以及查找,并支持单向链表的反转:

C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入.遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了份测试代码 /* 基本数据结构的定义以及函数的声明 */ typedef int ElemType; typedef struct Node { ElemType elem; struc

C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

// //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:写一个函数建立有3名学生数据的动态单向链表,并输出链表中每个结点的所有内容. /* 建立动态链表的思想: 1.开辟一个新结点,并使p1,p2指向它: 2.读入一个学生数据给p1所指的结点: 3.head = NULL,n = 0; 4.判断读

C语言学习之单向链表操作

该文件为单向链表操作的一些接口:(如发现有错误的地方,及时告知,不胜感激!) list.h #ifndef  _CHAINLIST_H_ #define  _CHAINLIST_H_ typedef struct { char key[15]; char name[20]; int age; }DATATYPE_T; typedef struct Node { DATATYPE_T  data; struct Node *next; }chainListType; /* 添加节点到链表末尾 */