连续存储---链表
链表示意图:
以下代码的主要功能是定义一个链表结点数据类型、创建链表、遍历输出链表内容。在VC6.0++ IDE中调试通过。
/*
以下这个程序实现了非循环链表的创建与遍历输出。(在vc6.0++中调试通过。)
链表有几个普及知识点:链表包括:数据域、指针域。头指针:指向头节点的指针。头节点:一个没有数据域的节点。尾指点:没有指针域的节点。
*/
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
//定义链表数据类型:数据域、指针域。
typedef struct Node
{
int data;//定义数据域
struct Node * pNext;//定义指针域
}* pNODE, NODE; //pNODE 即:struct Node *, NODE 即:struct Node.
pNODE create_list(void); //这个函数实现创建链表的功能,无需参数,返回头指针。
void traverse_list(pNODE); //这个函数通过接收头指针对链表的数据域进行输出。
int main(void)
{
pNODE pHead = NULL; //定义一个头指针。
pHead = create_list();
traverse_list(pHead);
return 0;
}
pNODE create_list(void)
{
int len,val;
int i;
//动态分配内存单元,大小为链表数据类型大小,并指返回的指针赋值给头指针pHead.
pNODE pHead = (pNODE)malloc(sizeof(NODE));
printf("%p\n",pHead);
if(NULL == pHead)
{
printf("动态内存分配失败!\n");
exit(-1);
}
//创建一个尾指针 pTail 的目的是:使pTail起一个穿针引线的作用、使次创建的内存块链起来。
pNODE pTail = pHead;
pTail->pNext = NULL;
printf("enter the length of list that you want to create !");
scanf("%d",&len);
for(i=0; i<len ; i++)
{
printf("请输入第 %d 个数据",i+1);
scanf("%d",&val);
pNODE pNew = (pNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("动态内存申请失败!");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
printf("%p\n",pHead);
return pHead;
}
//遍历输出链表只需要一个参数:头指针移动最后一个数据为NULL的结点为止。
void traverse_list(pNODE pH)
{
pNODE p;
p = pH->pNext;
while(NULL != p)
{
printf("%d\t",p->data);
p = p->pNext;
}
return;
}