[C语言] 单向链表的建立,头尾插,打印,删除及逆序操作(注释)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
int data;
struct Node* next;
}N;
//创建节点
N* MakeNode(int d)
{
N* node = (N*)malloc(sizeof(N));//分配内存
if(NULL==node){
printf("Fail to malloc\n");
return NULL;
}
memset(node,0,sizeof(N));//结构体未初始化时数据是脏的,需要清一下
node->data = d;
node->next = NULL;
}
//头插节点
void HeadAdd(N* pHead,N* newNode)
{
newNode->next = pHead->next;
pHead->next = newNode;
}
//尾插节点
void TailAdd(N* pHead,N* newNode)
{
N* p = pHead;
while(NULL!=p->next){
p = p->next;
}
p->next = newNode;
}
//打印链表
void PrintList(N* pHead)
{
N* p = pHead;
printf("当前链表为:");
while(NULL!=p->next){
p = p->next;
printf("%d ",p->data);
}
//跳出以上循环时,已经到了NULL的这个位置
printf("\n");
}
//删除数据对应的节点
void DeleteNode(N* pHead,int d)
{
N* p = pHead;
N* pre = NULL;
while(NULL!=p->next){
pre = p;
p = p->next;
if(p->data == d){
pre->next = p->next;
printf("成功删除%d\n",p->data);
return ;
}
}
printf("没有要删除的节点\n\n");
}
//反转链表
void TurnOver(N* pHead)
{
N* p = pHead->next;
N* pBack = NULL;
//空链表或者链表只含一个数据节点
if(NULL==p || NULL==p->next) return ;
while(NULL != p->next)
{
pBack = p->next;//保存第一个有效节点的下一个节点
//若是第一个有效节点,即头指针的下一个节点,应指向NULL
if(p==pHead->next){
p->next = NULL;
}
else{
p->next = pHead->next;
}
pHead->next = p;//头部连接
p = pBack;//保留下一个节点
}
HeadAdd(pHead, p);//把最后一个节点插在头指针后面
}
int main()
{
N* head = MakeNode(NULL);
int n,data;
printf("你想创建几个节点:");
scanf("%d",&n);
printf("依次输入数据:");
for(int i=0; i<n; i++){
scanf("%d",&data);
TailAdd(head,MakeNode(data));
}
PrintList(head);
int deleteNum;
for(int i=0; i<2; i++){
printf("你想删除哪个:");
scanf("%d",&deleteNum);
DeleteNode(head, deleteNum);
PrintList(head);
}
TurnOver(head);
printf("反转后为:");
PrintList(head);
return 0;
}
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799137.html