创建及输出链表

链表

有了顺序表为什么还要有链表呢?下面说说他们的异同把

链式存储:使用不连续的存储单元进行存储。

顺序存储:使用连续的存储单元进行存储。

假设,我们的内存空间只剩下1个G了,要存储一个G的数据,用顺序表的话就必须让系统给分配连续的1个G单元,要是没有就不能存储了,而链表就不需要.这就是优点所在.

链表结构如下:

                      数据域         指针域

Data

Next

数据域:用来存储本节点的数据。

指针域:用来存储下一个节点的地址。(指针指向下一个节点)

下面开始创建链表:

①   创建一个结构体,给他重命名为ElemSN。

         typedef struct node{

int  data;//数据域

struct node * next;//指针域

}ElemSN;//重命名为ElemSN

typedef  这个函数的作用就是重命名。

②给节点分配单元(动态单元)

分配动态单元要用到malloc函数,不懂得自己回去复习一下哦。

设类型名为ElemSN *;

ElemSN *p;

(ElemSN*)malloc(sizeof (ElemSN));

引用成员要用:

p->data;(数据域)

p->next;(指针域)

下面介绍一些术语:

前驱节点:链表中相邻的两个节点,前面的那一个。

后继节点:链表中相邻的两个节点,后面的那一个。

****前驱节点的指针域存放着后继节点的地址(说白了就是指向后继节点)

头结点:第一个节点,单向链表中没有前驱节点的节点、

尾节点:最后一个节点,单向链表中没有后继节点的节点。

单向链表的特点:

㈠     有且只有一个节点没有前驱——头结点

㈡     有且只有一个节点没有后继——尾节点

㈢     除了头尾节点之外,其余节点有且只有一个前驱,一个后继。

创建及输出链表:

假设数据集合为a={1,2,3,4,5,6}

#include<stdio.h>

 #include<stdlib.h>

 #define N 5

 typedef struct node{

         int data;

         struct node *next;

 }ElemSN;

 ElemSN *createlink1(int a[])

 {

         ElemSN *h=NULL,*tail,*p;

         for(int i=0;i<N;i++)

         {

                   p=(ElemSN*)malloc(sizeof(ElemSN));//分配一个动态单元给p

                   p->data=a[i];//数据域赋值

                   p->next=NULL;//指针域赋空

                   if(!h)

                            h=tail=p;//判断是不是第一个结点,是,头尾都指上来

                   else

                   tail=tail->next=p;     //不是,挂链,挪尾指针。

 }

 return h;//返回头指针h

 }

 void*printlink(ElemSN*h)

 {

         ElemSN*p;

         for(p=h;p;p=p->next)

                   printf("%5d",p->data);

 }

 int main (void)

 {

         int a[N]={1,2,3,4,5};

         ElemSN *head=NULL;

         //正向创建链表

 head=createlink1(a);//用head接收头指针

 //输出链表

 printlink(head);

 return 0;

}

​谢谢大家我是小纸人。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭