首先提一下链表跟数组的区别
链表与数组的相同之处在于:两者都是线性的数据结构。
链表不同于数组的地方在于:数组的数据在内存中是连续存储的,而链表中的节点则是离散存储的。
链表中每个节点包括两个部分:数据域、指针域。数据域存储的就是这个节点所存储的数据,指针****域存储的是下一个节点的地址。这样,两个离散的节点之间就通过前一个节点的指针域所连接以来了。
下面是简单单向链表的生成函数及遍历函数示例
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node //创建结构体变量,data代表数据域,pnext表示指针域
{
int data;
struct node* pNext;
}NODE ,*PNODE; //typedef定义 NODE代表struct node *PNODE代表struct node*
PNODE creat_list(void);
void traverse_list(PNODE pHead);
int main()
{
PNODE pHead=NULL;
pHead=creat_list();
traverse_list(pHead);
return 0;
}
PNODE creat_list(void)
{
int len;//链表长度
int i;
int val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL)
{
printf("malloc erro1\n");
exit(0);
}
PNODE pTail=pHead;//创建一个Ptail ,跟pHead储存同一个地址
pTail->pNext=NULL;//这时Ptail 跟pHead 的指针域都为NULL
printf("input len val:\n");
scanf("%d",&len);
for(i=1;i<=len;i++)
{
printf("input list %dth data val \n",i);
scanf("%d",&val)
PNODE pNew=(PNODE)malloc(sizeof(NODE));//生成一个新的结点
if(NULL==pNew)
{
printf("malloc erro2\n");
exit(0);
}
pNew->data=val; //给新生成的节点的数据域赋值
pTail->pNext=pNew; //新生成的节点的地址赋值给了ptail的指针域,同时也就赋值给了phead;
pNew->pNext=NULL; //新节点的指针域为NULL
pTail=pNew; //第一次循环产生的节点的地址给到PTAIL 这样第二次产生的新节点就能与第一次生成的节点产生连接,以此类推
}
return pHead; //返回的PHEAD使用遍历就能获取到链表中所有节点种的数据域
}
void traverse_list(PNODE pHead)
{
PNODE p=pHead->pNext;//PHEAD中的数据域未赋值,所以指向下一节点;
printf("这是链表中的数据:\n");
while(p!=NULL)
{
printf("%d\n",p->data);//第一次输出的值为头节点中指针域指向的节点中的数据域
p=p->pNext;
}
}
链表的生成函数中pTail的作用相当于是起到了中介的作用,生成一个新节点并与上一节点产生连接时,并不直接对上一个节点进行操作,而是通过pTail来进行操作
运行结果: