链表原理理解
链表作为一种线性数据,通过前后节点的指针指向,将所有数据串联起来。为了实现链表数据域的整体耦合,需要额外的指针域来标定前后数据的连接。通过下面的链表结构图,可以非常容易的理解链表的组成结构
头节点作为链表,不设定数据域,而其他节点则由数据域域指针域组合而成
C语言对于链表的代码的实现
1,创建结构体并命名
创建链表前需要先创建结构体作为节点和头指针:
typedef struct Node //typedef方法函数可以对于struct Node进行重命名
{int i;struct Node* next;}LNode,*LinkList; //定义一个结构体指针方便后续的操作
2,链表初始化
通过创建空数据域作为头节点来创建一个指针
LinkList InitList()
{LinkList L=(LNode *)malloc(sizeof(LNode)); //为头结点动态分配内存L->next=NULL; //初始化时头结点指向空return L;
}
3,求链表的长度
程序操作步骤为:
-
定义一个空指针指向链表的头节点,并根据链表节点的指向移动该指针,直到该指针指向空节点时停止
-
定义int字段标记链表长度,在申请的指针移动时累加记录并最后返回结果
int GetListLength(LinkList L)
{int listlength=0;LNode *p=L->next;while(p){listlength++;p= p->next;}return listlength;
}
4,初始链表添加值
对于空链表添加值,有头插法和尾插法
头插法:
void HeadInsertList(LinkList L,int data)
{scanf("%d",&data);LNode *p=(LinkList)malloc(sizeof(LNode));p->i=data;p->next=L->next;L->next=p;
}
头插法插入数据逻辑简单,但是插入数据与在链表中的排序顺序相反
尾插法
void EndInsertList(LinkList L,int data)
{LNode *End;End=L; while(End->next){End=End->next; } LNode *p=(LinkList)malloc(sizeof(LNode));p->i=data;End->next=p;p->best=NULL;
}
尾插法相对于头插法来说,数据的插入顺序与在链表中的数据顺序时一致的
5,实现链表的遍历输出
void TraverList(LinkList L)
{LNode *p=L->next;while(p) //由于最后的节点指向空,可以通过这一特点结束遍历{printf("%d ",p->i);p=p->next;}
}
总结
上面就是链表的创建中的一些流程,可以 使用这些方法去做自己的链表哟