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

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值