#include<stdio.h>
#include<stdlib.h>

struct Node{
   
	int data;
	struct Node *next;//结构体指针 
}; 

struct Node* createlist()//创建链表 
{
   
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));//开辟空间 
	headNode->next=NULL;//头指针指向NULL 
	return headNode;
}

struct Node* createNode(int data)//创建结点 
{
   
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data=data;//记录数据 
	newNode->next=NULL;//结点指针指向NULL 
	return newNode;
}

void printlist(struct Node* headNode)//打印链表 
{
   
	struct Node* pMove = headNode->next;//需要一个新的指针结构体移动来输出 
	while (pMove)//pMove不为空时,循环继续 
	{
   
		printf("%d\t",pMove->data);//输出 
		pMove = pMove->next; //指向下一个 
	}
	printf("\n");
} 

void insertNodeByHead(struct Node* headNode,int data)//插入结点 
{
   
	struct Node* newNode = createNode(data);//把数据存入一个结点中 
	newNode->next = headNode->next;//新结点的指针 指向 插入位置结点的指针指向的位置 
	headNode->next = newNode;	   //插入位置结点的指针 指向 新结点 
} 

void deleteNodeByAppoin(struct Node* headNode,int posData)//删除结点 (从头开始) 
{
   
	struct Node* posNode = headNode->next;//找到要删除的结点 
	struct Node* posNodeFront = headNode;//找到要删除的前一个结点 
	
	if(posNode == NULL)//删除结点不存在 
	{
   
		printf("无法删除,链表为空\n");
	}
	else
	{
   
		while(posNode->data != posData) //直到找到要删的数据 
		{
   
			posNodeFront = posNode;       // 向后移一个 
			posNode = posNodeFront->next; // 向后移一个 
			if(posNode == NULL){
             // 为空不存在 
 				printf("无法删除,链表为空\n");
				return ;
			}
		}
		posNodeFront->next = posNode->next;//前一个结点指针直接指向删除结点后的结点 
		free(posNode);//释放删除结点 
	}
}

int main(){
   
	struct Node* list = createlist();
	insertNodeByHead(list,1);
	insertNodeByHead(list,2);
	insertNodeByHead(list,3); 
	printlist(list);
	deleteNodeByAppoin(list,2);
	printlist(list);
	system("pause");
	return 0;
}