链表(入门)

  1.数据的储存的方法有:数组和链表;

    链表对于数组的优化有:<1.>不用开始时就精确的制定所需内存单元的大小;

      <2>.对数组中的元素进行增、删、改时特别不方便;

       但链表也有它的不足:由于它不是在内存单元上连续存储的,所以链表中的数据查询起来没           有数组那么简单。

链表(单链表):   0024             0004                  0008                    NULL(指针域)

          结点:              丙        ·         乙                        甲                       丁    (数据域)

       存储位置:        0004              0008                  0016                     0024

     * 指针域和数据域是结点所要存储的数据,数据按甲、乙、丙、丁的顺序排列,存储甲的结点需要保存甲自身的数据域和乙的指针域,乙、丙也相同,而丁作为最后一个元素,保存的指针域便是一个空指针;

     链表中各元素类型一致。

2.链表分类:

单链表:指针域只有一个的链表;(数据域+后继元素地址)

双链表:指针域有两个的链表;(前一元素地址+数据域+后继元素地址)

循环链表:最后一个元素的指针域非空且为首元素地址。

3.链表组成:

头指针(唯一确定单链表)+头结点(可有可无)+首元结点......+尾结点

4.单链表存储数据:

存储学生信息

1.不常用

typedef struct student
{
    char num; //存储学号
    char name; //存储姓名
    int score; //´存储成绩
    struct  Linklist * next; //建立指针域 
}Lnode,Linklist; 

2.常用

typedef struct 
{
    char num; //存储学号
    char name; //存储姓名
    int score; //´存储成绩 
}Elemtype;

typedef struct Node

{

Elemtype data;

struct  Linklist * next; //建立指针域

}Node,Linklist;

5.单链表的构建

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;//储存结点数据
    struct node*next;//储存下一结点地址
};//注意结构体创建有分号
int main(void)
{
    struct node * head,* p,* q,* t;
    int i,n,a;
    scanf("%d",&n);//数据元素个数
    head = NULL;//头指针初始为空
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);//输入n个数据
        p=(struct node *)malloc(struct node);//动态申请一个空间用来存放结点
        p->data = a;
        p->next = NULL;
        if(head==NULL)//头结点
            head=p;
        else//非头结点
            q->next = p;
            q = p;
    }
t = head;
while(head!=NULL)
    printf("%d',t->data);
    t=t->next;
}
            

6.链表的插入

原理:首先由头指针开始遍历个结点,找到合适的位置后插入

scanf("%d",&a);//要插入的数
t = head;//由原链表头指针开始遍历
while(t!=NULL)//循环条件
{
    if(t->next->data>a)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->data=a;
        p->next=t->next;
        t=p->next;
        break;
    }
t=t->next;
}

7.链表中第m个数据的查找

int m,j=0;
scanf("%d",&m);
	t = head;
	while(t!=NULL)
	{
	    ++j;//计数器
		if(j==m)
		{
			printf("%d",t->data);
		}
		t=t->next;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值