链表创建及功能实现
QT旧版本没搞明白怎么支持输出中文所以只能拿出散装英语了= =
语法错误勿怪哈~
ps:关于尾指针的一些心得
在头指针创建后,尾指针也创建了(其实都是一个节点指针的变量,只是头指针分配了内存,尾指针没有分配,只是一个指针变量),并指向头指针,这时候只有一个头指针,所以尾指针将指针域设置为NULL,也就是头指针的指针域设置为NULL,当要执行添加操作时,尾指针就像一个帽子,趴在目前最近的节点头上,看到NEW了一个新的节点,就将身下的节点的指针域由NULL改为NEW的节点的地址,然后喊NEW的节点把自己的指针域改为NULL,然后脱离目前这个节点-,跳到NEW的那个节点的头上,完成添加操作。
createList创建链表
//创建链表
PNODE createList()
{
int len; //有效节点的个数
int val; //存放临时数据
PNODE pHead = (PNODE)malloc(sizeof(Node));
if(NULL == pHead)
{
printf("malloc failed \n");
exit(-1);
}
//因为还没有新的节点,这时候尾指针和头指针指向同一个内存
pTail->pNext = NULL;
printf("The len you need is: ");
scanf("%d", &len);
//对链表进行初始化,为所创建的len长度的链表分配内存并赋值
for(int i=0; i<len; i++)
{
//printf里面的%d都是为逗号,后面的值服务的,在输出的时候%d就会替换为逗号后面的值,这里是逗号后面的值给前面的%d
printf("Please enter no.%d segment val: ", i+1);
//scanf这里是输出,是%d的值给后面的val,和printf的方向相反,这里把输入的值传递给变量val
scanf("%d", &val);
//为新节点分配空间
PNODE pNew = (PNODE)malloc(sizeof(NODE));
{
if(NULL == pNew)
{
printf("failed \n");
exit(-1);
}
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
遍历并输出链表内容
//遍历并输出链表内容
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
printf("the value of the whole list now is :");
while(NULL != p->pNext)
{
printf("%d ", p->data);
p = p->pNext;
}
//如果p为尾节点了,就把这最后一个p的数据打印出来然后换行
printf("%d \n \n", p->data);
return;
}
尾部追加
//尾部追加
void append_list(PNODE pHead)
{
int val;
PNODE p = pHead->pNext;
while(NULL != p->pNext)
{
p = p->pNext;
}
//创建一个新的节点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("append failed \n");
}
printf("scanf the data you want to append: ");
//想要给这个变量传值就要取地址,因为这是一个临时变量而非指针
scanf("%d", &val);
pNew->data = val;
//跳出循环时p就指向最后一个节点
p->pNext = pNew;
pNew->pNext = NULL;
return;
}
删除指定位置节点
//删除指定位置(首节点为1)
void delete_list(PNODE pHead)
{