#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
int num;
typedef struct Node{
int val; // 数值域
struct Node *next; //指针域
}NODE,*PNODE; //定义一个结构体和一个带指针的结构体
PNODE create_list(); //创建一个链表
void traverse(PNODE pHead); //遍历输出
bool inist(PNODE pHead,int pos, int num); //插入节点
bool del_list(PNODE pHead,int pos); //插入节点
bool is_empty(PNODE pHead); //判断是否为空
int main()
{
int pos;
int num;
PNODE pHead = NULL;
pHead = create_list();
traverse(pHead);
if(is_empty(pHead))
printf("this Arr is empty");
printf("please enter the insert pos where you want and the val:");
scanf("%d %d",&pos,&num);
// inist(pHead,pos,num);
if(inist(pHead,pos,num)) // 插入一个节点并判断
traverse(pHead);
printf("\n\n");
if(del_list(pHead,3)) // 插入一个节点并判断
traverse(pHead);
return 0;
}
PNODE create_list()
{
int len,number;
PNODE pHead = NULL; // 头节点默认初始化为NULL
pHead = (PNODE)malloc(sizeof(NODE));// 头节点分配动态地址
if (pHead == NULL)
{
printf("malloc failure,Quit\n"); //动态地址没有分配成功退出程序
return -1; //return -1表执行失败
}
PNODE pEnd = pHead;
pEnd->next = NULL; // 尾节点pNext指向空代表链表结束点
printf("please input the linked list len=");
scanf("%d",&len);
for(int i=0;i<len;i++) //遍历输入
{
printf("请输第%d个节点值",i+1);
scanf("%d",&number);
// 对比图1
PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新的链表节点
pNew->val = number; //pNew 获取写入的值
pEnd->next = pNew; //将pNew的整体结构赋值给pEnd->next
pNew->next = NULL; //pNew->next指向为NULL
pEnd = pNew; //pEnd 更新为新的节点
}
return pHead;
}
void traverse(PNODE pHead){
PNODE p=pHead->next;
while(p != NULL) // p!=NULL 表示一直遍历到pEnd->next!=NULL为止
{
printf("%d\n",p->val); //输出val值
p = p->next; // p->next赋值给p再输出
}
}
bool inist(PNODE pHead,int pos, int num){
int i=0;
PNODE p=pHead;
while(p != NULL&& i<pos-1)
{
// printf("%d\n",p->val);
p = p->next;
i++;
}
if(i>pos || p == NULL)
{
return false;
}
PNODE pNew = (PNODE)malloc (sizeof(NODE)); //开辟动态空间存放新节点
if(p == NULL)
{
return false;
}
pNew->val =num;
PNODE q=p->next; //建立一个中转节点 并将p->next 的值赋给他 ,腾出p-next位置
p->next = pNew; //空出的P-next 位置放入p new
pNew->next = q; //pNew->next 指向q形成新的节点链接下一个
/* 方法二
减少了倚中转取代节点 对比图2
pNew->next = p->next;
p->next = pNew;
*/
return true;
}
bool del_list(PNODE pHead,int pos){
int i=0;
PNODE p=pHead;
while(p != NULL&& i<pos-1)
{
// printf("%d\n",p->val);
p = p->next;
i++;
}
if(i>pos || p == NULL)
{
return false;
}
/* PNODE pNew = (PNODE)malloc (sizeof(NODE));
if(p == NULL)
{
return false;
}
*/ //以上部分和insert类似
//对比图3
PNODE pNew=p->next; //方法与insert方法二相似
// *val = p->val 保留删除的值
p->next = pNew->next;
free(pNew) ; //释放空间以免溢出
return true;
}
bool is_empty(PNODE pHead)
{
if(pHead->next == NULL) //pHead->==NULL 此时pEnd与pHead是重合状态,如:len=0时
return true;
else
return false;
}
图1 新建链表
图示 2 插入节点
图3 删除节点;