单向动态链表(建立,尾插,删除,输出,插入,倒置)

该博客详细介绍了使用C语言实现链表的基本操作,包括创建头结点、在链表末尾插入节点、删除指定位置的节点、反转链表以及遍历输出链表所有元素的函数。示例代码中还包含了计算链表长度和插入节点的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
typedef struct Node        //定义一个结构体类型Node  //链表结点 
{
	int data;              //数据域:存放数据 
	struct Node *next;    //指针域,指针变量 :存放地址 
}N,*P;                     //用typedef给结构体类型Node取了一个别名 N, 给struct Node*类型取了一个别名P
P create(void){            //创建头结点 
	P head = (P)malloc(sizeof(N));      //malloc函数动态分配内存 ,新建一个头指针等价于:struct Node head = (struct node*)malloc(sizeof(struct Node)) 
	if(head == NULL){
		printf("分配内存失败,程序退出\n");
		exit(-1); 
	} 
	head->next = NULL;
	return head;
} 
void input(P head,int value){  //在链表最后增加一个结点 
	P last = (P)malloc(sizeof(N));
	if(last == NULL){
		printf("分配内存失败,程序退出\n");
		exit(-1);
	}
	last->data = value;
	last->next = NULL;
	while(head->next != NULL) //将头指针指向尾结点 
	      head = head->next;
	head->next = last;  //将尾节点的指针域指向新建的尾结点(尾插法) 
}
void show(P head){    //输出所有结点元素 
	while(head!= NULL){
		printf("%d\n",head->data);
		head = head->next;  //指向下一个结点 
	}
}
int len(P phead){      //计算有效节点的个数 
	int i;
	for(i= 0;phead->pnext != NULL;++i)
	phead = phead->pnext;
	return i; 
}
_Bool del(P phead,int index){  //删除某个有效节点   把以 phead为头指针的链表 中的第index个节点删除 
    int i;
	if(index <= 0 || index >len(head))  //无效结点 
	    return -1;
	for(i=1;i<index;++i)   //将头指针移动到所删除结点的前一个结点位置 
	    head = head->next;
	P tail = head->next->next;  //保存所删除结点的下一个结点的指针 
	free(head->next);  //释放所删除结点的指针 
	head->next = tail;
	return 1;
} 
_Bool insert(P head,int index,int value){  //插入一个节点    (头指针,插入的位置,新建节点的data的值 )
    int i; 
	if(index <= 0 || index > len(head)+1)
	    return -1;
	P pw = (P)malloc(sizeof(N));  //新建节点 
	if(pw == NULL){
		printf("分配内存失败,程序退出\n");
		exit(-1); 
	} 
	pw->data = value; //内存分配成功,将value的值赋给新建节点的data 
	for(i=1;i<index;++i)
	    head = head->next;   //所要插入的节点的上一个节点的位置
	pw->next = head->next;   //插入位置的下一个结点指针赋给新建结点指针域 
	head->next = pw;         //新建结点的指针域赋值给头节点         
} 
void invert(P head){ //链表倒置 
	if(head->next == NULL){
		return;
	}
	P p0 = head->next;  //保存第一个有效结点地址 
	P p1 = p0->next;    //保存第一个有效节点的next的值 (第二个结点的地址) 
	P p_0 = p0,p2;
	while(p1 != NULL){  //链表有第二个有效结点 
		p2 = p1->next;  //先保存第二个有效节点的指针域 
		p1->next = p0;  //再将第二个结点指向前一个结点 
		p0 = p1;
		p1 = p2;
	}
	head->next = p0;
	p_0->next = NULL;
} 
int main(void){
	P head = create();
	input(head,1);
	input(head,2);
	input(head,3);
	input(head,4);
//	del(head,2);
//  insert(head,2,10);
    invert(head);
	show(head);
	printf("有效节点的个数为%d",len(head));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值