链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素,一个简单的链表如下图所示
链表中每一个元素称为结点,每一个结点都是由数据域和指针域组成的,每个结点的指针域指向下一个结点
非循环单链表的实现:
要实现非循环单链表首先应定义一个结点结构
typedef struct Node//结点结构
{
int data;//数据域
struct Node *pNext;//指针域
}NODE, *PNODE;
定义两个函数用于实现链表的创建和遍历
//创建链表
PNODE Create_list(void);
//遍历链表
void Traverse_list(PNODE pHead);
链表创建算法:创建一个不存放有效数据的头结点pHead——定义一个永远指向尾结点的结点pTail——清空pTail的指针域——输入需要创建的结点的个数——输入第一个结点的数据域val——创建一个临时结点pNew——将输入的值赋给pNew的数据域(pNew->data=val)——将pNew挂到头结点后(pTail->pNext=pNew)——清空pNew(pNew->pNext=NULL)——将pTail移到pNew上(pTail=pNew)
重复后面几步直到创建完成
链表的创建代码:
//创建链表
PNODE Create_list(void)
{
int len;//结点的个数
int val;//临时保存结点的值
//分配一个不存放有效数据的头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
{
printf("内存分配失败,程序终止!");
exit(-1);
}
//定义一个永远指向尾结点的结点
PNODE pTail = pHead;
pTail->pNext = NULL;
printf("请输入您需要生成的链表的结点的个数:");
scanf("%d",&len);
for(int 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;
}
return pHead;
}
链表遍历算法:定义一个结点p——p为头结点的指针域(p=pHead->pNext)——循环遍历结点,直到p为空退出循环
链表遍历实现代码:
//遍历链表
void Traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL != p)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node//结点结构
{
int data;//数据域
struct Node *pNext;//指针域
}NODE, *PNODE;
//创建链表
PNODE Create_list(void);
//遍历链表
void Traverse_list(PNODE pHead);
void main()
{
PNODE pHead = NULL;
pHead = Create_list();//创建一个非循环单链表
Traverse_list(pHead);//遍历链表
system("pause");
}
//创建链表
PNODE Create_list(void)
{
int len;//结点的个数
int val;//临时保存结点的值
//分配一个不存放有效数据的头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
{
printf("内存分配失败,程序终止!");
exit(-1);
}
//定义一个永远指向尾结点的结点
PNODE pTail = pHead;
pTail->pNext = NULL;
printf("请输入您需要生成的链表的结点的个数:");
scanf("%d",&len);
for(int 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;
}
return pHead;
}
//遍历链表
void Traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL != p)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
测试程序:创建一个有5个结点的链表