#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
若爱,请深爱;若弃,请彻底。不要暧昧,伤人伤己
(1)不应该牺牲程序的可读性
*/
/*
(1)pTail->next = pNew; //新构造的结点挂到指定结点
(2)append_list()函数中:对p->next判空
(3)注意尾结点指针域设置为NULL
*/
//定义数据类型,并为其分配内存
#define NODE_LEN sizeof(NODE)
typedef struct Node
{
float value;
struct Node * next;
}* PNODE, NODE;
PNODE create_list(); //构造一个指定长度的链表
void traverse_list(PNODE pHead); //遍历链表
bool append_list(PNODE pHead, float value); //追加结点值
bool insert_list(PNODE pHead, int pos, float value); //指定位置插入结点值
int main(void)
{
PNODE pHead = NULL; //定义头指针
printf("pHead指针的内存空间长度:%d \n", sizeof(pHead));
pHead = create_list();
traverse_list(pHead);
append_list(pHead, 100);
traverse_list(pHead);
insert_list(pHead, 2, 80);
traverse_list(pHead);
append_list(pHead, 100);
traverse_list(pHead);
return 0;
}
PNODE create_list()
{
int len; //链表的长度
float value; //临时节点值
printf("请输入链表的长度:");
scanf("%d", &len);
PNODE pHead = (PNODE)malloc(NODE_LEN); //分配一个不存放有效数据的头结点
//判空
PNODE pTail = pHead;
for(int i = 0; i < len; i++)
{
printf("请输入当前节点的值:");
scanf("%f", &value);
PNODE pNew = (PNODE)malloc(NODE_LEN);
//判空
pNew->value = value;
pTail->next = pNew; //新构造的结点挂到
pNew->next = NULL;
pTail = pNew; //新构造的结点转化为尾巴结点
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->next;
while(NULL != p)
{
printf("%f \t", p->value);
p = p->next;
}
printf("\n");
}
bool append_list(PNODE pHead, float value)
{
PNODE p = pHead->next;
while(NULL != p)
{
if(NULL == p->next)
{
break;
}
p = p->next; //此时p结点就是空节点
}
PNODE pNew = (PNODE)malloc(NODE_LEN);
pNew->value = value;
p->next = pNew;
pNew->next = NULL;
return true;
}
bool insert_list(PNODE pHead, int pos, float value)
{
int count = 1; //计数器
PNODE p = pHead->next;
while(NULL != p)
{
count++;
if(count == pos)
{
break;
}
p = p->next;
}
PNODE pNew = (PNODE)malloc(NODE_LEN);
pNew->value = value;
pNew->next = p->next;
p->next = pNew;
return true;
}