学习笔记--链表

#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        删除节点;

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值