链表专业术语:
首节点:第一个有效节点
尾节点:最后一个有效节点
头节点:第一个有效节点之前的那个节点
头节点并不存放数据
加头节点的目的主要是为了方便对链表的操作
头指针:指向头节点的指针变量
尾指针:指向尾节点的指针变量
//2012年9月12日 早上
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE, *PNODE;
//函数的声明
PNODE create_list(void);
void traverse_list( PNODE pHead );
int main( void )
{
PNODE pHead = NULL;//等价于struct Node *pHead = NULL;
pHead = create_list();//创建一个非循环单链表,并将该链表的头节点的头结点的地址赋给pHead
traverse_list( pHead );
return 0;
}
PNODE create_list(void)
{
int len;//用来存放节点有效节点的个数
int i;
int val;//用来临时存放用户输入的节点的值
//分配了一个不存放有效数据的头节点
PNODE pHead = ( PNODE )malloc( sizeof( NODE ) );
if( NULL == pHead )
{
printf( " 分配失败,程序终止 " );
exit( -1 );
}
PNODE pTail = pHead;//pTail指向链表的尾指针,刚开始时尾指针后头指针指向的相同
pTail->pNext = NULL;
printf( " 请输入你需要生成的链表节点的个数:len = " );
//scanf( " %d ", &len ); //注意了,这里要先打一个空格,在输入一个数字,因为%d前面有个空格,所以......
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;//
}
return pHead;
}
void traverse_list( PNODE pHead )
{
PNODE p = pHead->pNext;
while( NULL != p )
{
printf( " %d ", p->data );
p = p->pNext;
}
printf( " \n " );
return;//意思是告诉别人程序已经结束
}