# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node * pNext; //指针域
}NODE, *PNODE;//BODE等价于struct Node PNODE等价于strucr Node *
PNODE create_list(void);//函数声明
void traverse_list(PNODE pHead);
int main(void)
{
PNODE pHead = NULL;//等价于strucr Node *pHead = NULL
pHead = create_list();// create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址返回
traverse_list(pHead);// traverse_list功能:输出链表中的每一个元素
return 0;
}
PNODE create_list(void)//创建一个非循环单链表, 不需要参数,返回PNODE类型
{
int len;//用来存放有效节点的个数
int i;
int val;//用来临时存放用户输入的结点的值
PNODE pHead = (PNODE)malloc(sizeof(NODE));// PNODE等价于strucr Node * 分配一个不存放有效数据的节点,既 头结点
if (NULL == pHead)
{
printf(“分配失败,程序终止”);
exit(-1);//终止所在函数的程序,并返回-1,与return不同的是return只会终止同一级的程序
}
//分配动态内存后,要养成检测能否分配成功的习惯
PNODE pTail = pHead; //把头结点的地址赋给pTail
pTail->pNext = NULL; //将pTail的指针域定义为空,此时这个链表只要头结点,即这是一个空链表
printf(“请您输入生成的链表的节点个数: len = “);
scanf(“%d”, &len);
for (i=0; i < len; i++)
{
printf(“请输入第%d个节点的值:” , i+1);
scanf(“%d “,&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //定义一个NODE型数据变量,并分配动态内存
if (NULL == pNew)
{
printf(“分配失败,程序终止\n”);
exit(-1); //终止所在函数的程序,并返回-1
}
//分配动态内存后,要养成检测能否分配成功的习惯
pNew->data = val; //pNew为一个有效节点,此处为这个节点的数据域赋值
pTail->pNext = pNew; //执行此处后pTail指向pNew这个节点
pNew->pNext = NULL; //将NULL赋给pNew这个节点的指针域
pTail = pNew; //此时pTail这个节点等价于 pNew这个节点
//通过这四步的循环,每循环一次增加一个节点,并且将尾节点的指针域赋为空值
}
return pHead; //原因是通过链表的头结点能确定整个链表故返回链表的头节点地址
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext ; //定义PNODE型变量p,将pHead->pNext 赋给p
while (NULL != p) //若p不为空,则输出它的数据域
{
printf(“%d “,p->data );
p = p->pNext ; //将P向后移一个节点
}
printf(“\n”);
}
/*–
在VC++6.0中的运行结果为
请您输入生成的链表的节点个数: len = 3
请输入第1个节点的值:1
2
请输入第2个节点的值:3
请输入第3个节点的值:4
1 2 3
Press any key to continue
–*/
/*–
问一下为什么在输入第一个节点后输入第二个节点是不会提示输入第二
个节点,本人试过在 scanf(“%d”, &len);函数下一行插入printf输
出一个参考物,但是结果表示在输入第一个节点的值后不会输出参考
物,请高手解惑!
–*/
# include<malloc.h>
# include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node * pNext; //指针域
}NODE, *PNODE;//BODE等价于struct Node PNODE等价于strucr Node *
PNODE create_list(void);//函数声明
void traverse_list(PNODE pHead);
int main(void)
{
PNODE pHead = NULL;//等价于strucr Node *pHead = NULL
pHead = create_list();// create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址返回
traverse_list(pHead);// traverse_list功能:输出链表中的每一个元素
return 0;
}
PNODE create_list(void)//创建一个非循环单链表, 不需要参数,返回PNODE类型
{
int len;//用来存放有效节点的个数
int i;
int val;//用来临时存放用户输入的结点的值
PNODE pHead = (PNODE)malloc(sizeof(NODE));// PNODE等价于strucr Node * 分配一个不存放有效数据的节点,既 头结点
if (NULL == pHead)
{
printf(“分配失败,程序终止”);
exit(-1);//终止所在函数的程序,并返回-1,与return不同的是return只会终止同一级的程序
}
//分配动态内存后,要养成检测能否分配成功的习惯
PNODE pTail = pHead; //把头结点的地址赋给pTail
pTail->pNext = NULL; //将pTail的指针域定义为空,此时这个链表只要头结点,即这是一个空链表
printf(“请您输入生成的链表的节点个数: len = “);
scanf(“%d”, &len);
for (i=0; i < len; i++)
{
printf(“请输入第%d个节点的值:” , i+1);
scanf(“%d “,&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //定义一个NODE型数据变量,并分配动态内存
if (NULL == pNew)
{
printf(“分配失败,程序终止\n”);
exit(-1); //终止所在函数的程序,并返回-1
}
//分配动态内存后,要养成检测能否分配成功的习惯
pNew->data = val; //pNew为一个有效节点,此处为这个节点的数据域赋值
pTail->pNext = pNew; //执行此处后pTail指向pNew这个节点
pNew->pNext = NULL; //将NULL赋给pNew这个节点的指针域
pTail = pNew; //此时pTail这个节点等价于 pNew这个节点
//通过这四步的循环,每循环一次增加一个节点,并且将尾节点的指针域赋为空值
}
return pHead; //原因是通过链表的头结点能确定整个链表故返回链表的头节点地址
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext ; //定义PNODE型变量p,将pHead->pNext 赋给p
while (NULL != p) //若p不为空,则输出它的数据域
{
printf(“%d “,p->data );
p = p->pNext ; //将P向后移一个节点
}
printf(“\n”);
}
/*–
在VC++6.0中的运行结果为
请您输入生成的链表的节点个数: len = 3
请输入第1个节点的值:1
2
请输入第2个节点的值:3
请输入第3个节点的值:4
1 2 3
Press any key to continue
–*/
/*–
问一下为什么在输入第一个节点后输入第二个节点是不会提示输入第二
个节点,本人试过在 scanf(“%d”, &len);函数下一行插入printf输
出一个参考物,但是结果表示在输入第一个节点的值后不会输出参考
物,请高手解惑!
–*/
解决方案
10
for (i=0; i < len; i++) { printf("请输入第%d个节点的值:", i+1); scanf("%d",&val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); //定义一个NODE型数据变量,并分配动态内存
去掉引号中的空格
scanf("%d", &val);
20
scanf(“%d “,&val); %d后面多了一个空格