• 什么是链表

链表是一种常见的重要的数据结构。它是动态进行储存分配的一种结构

  • 和数组的区别

数组存放数据时,必须事先定义数组长度,如果不知道具体长度,只能定义一个足够大的长度

链表则没有这种缺点,他能根据需要开辟内存单元

  • 结点

每个结点包括两个数据,用户实际的数据+下一个结点的地址

  • 最后一个元素

该元素不在指向其他元素,它的地址部分放NULL;

  • 静态链表

这个例子比较简单,所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表成为静态连表

#include<stdio.h>
struct MyStruct
{
    int id;
    float score;
    MyStruct *next;
};
int main()
{
    struct MyStruct a, b, c, *head, *p;
    a.id = 111; a.score = 1.1;
    b.id = 222; b.score = 2.2;
    c.id = 333; c.score = 3.3;
    head = &a;
    a.next = &b;
    b.next = &c;
    c.next = NULL;
    p = head;
    while (p!=NULL)
    {
        printf("%d,%lf\n", p->id, p->score);
        p = p->next;
    }
}

  • 建立动态连表

所谓建立动态链表是指在程序运行当中从未到有地建立一个链表,即是一个个地开辟结点和输入各结点的数据,并建立起前后相连的关系

#include<iostream>//最简单的链表 
using namespace std;
struct stu
{
    int id;
    double score;
    stu *next;
};
int n=0;
stu * creat()//创建链表,输入数据返回头结点 
{
    stu *p1,*p2,*head;
    p1=p2=new stu();//很重要这块,考试之前一定打在打两遍 ,一个个建立结点,开辟空间
    head=NULL;
    cin>>p1->id>>p1->score;
    while(p1->id!=0)//五角星 
    {
        n++;
        if(n==1) head=p1;
        else p2->next=p1;
        p2=p1;
        p1=new stu();
        cin>>p1->id>>p1->score;
    }
        p2->next=NULL;
        return head;
}

void print(stu *head)//遍历链表 
{
    stu *p;
    p=head;
    while(p!=NULL)//是while不是if 
    {
        cout<<p->id<<p->score<<endl;
        p=p->next;
    }
}

int main()
{
    stu *p;
    p=creat();
    print(p);
}