非循环单向链表-增删改查排-释放

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

typedef struct nodes//链表主体结构
{
	int data;//链表DATA区域
	struct nodes *next;//链表指针区域
}node,*pnode;

pnode creat()//创建链表头节点和主体节点
{
	int i=0,data;
	pnode phead=NULL,pnew,ptail;

start:
	i++;
	printf("给第%d个节点赋值(输入0完成链表建立)请输入:",i);
	scanf("%d",&data);

head:
	if(!data)//判断输入是否为0,为0完成链表建立
	{
		printf("链表建立完成!\n");
		return phead;
	}
	
	if(!(pnew=malloc(sizeof(node))))//分配链表节点内存空间
	{
		printf("分配内存错误!!!");
		exit(0);
	}
	
	if(!phead)//生成头节点
	{
		phead=ptail=pnew;
		goto head;
	}

	pnew->data=data;//给新节点赋值			
	ptail->next=pnew;//把新节点挂载到尾节点
	pnew->next=NULL;//新节点指针置为空
	ptail=pnew;//把新节点记录为尾节点
	
	goto start;
}

int print(pnode phead)//读取链表,空返回0,不空返回链表长度
{
	int sum=0;
	pnode p = phead->next;
	if(!p)
	{
		return 0;
	}
	else
	{
		printf("链表的值为:");
		while(p)//判断是不是尾节点
		{
			printf("  %d",p->data);//输出节点值
			p=p->next;//把指针指向下一节点
			sum++;//计算长度
		}
		printf("\n");
		printf("链表的长度为:%d\n",sum);
		return sum;
	}
}

insert(pnode p,int find,int val)//加入一个节点,find为插入节点位置
{
	int i;
	pnode ptail,pnew;
	
	for(i=0;p&&i<find-1;i++)
	{
		p=p->next;
	}
	
	if(p)
	{
		if(!(pnew=malloc(sizeof(node))))//创建一个新的动态节点
		{
			printf("分配内存错误!!!");
			exit(0);
		}
		
		pnew->data=val;
		
		ptail=p->next;
		p->next=pnew;
		pnew->next=ptail;
	}
	else
	{
		printf("输入插入节点溢出!!!");
		exit(0);
	}
	
	return;
}

remove(pnode p,int find)//弹出一个节点
{
	int i;
	pnode q;
	for(i=0;p->next&&i<find-1;i++)
	{
		p=p->next;
	}
	
	if(p->next)
	{
		q=p->next;
		p->next=p->next->next;
		printf("删除节点的值为:%d\n",q->data);
		free(q);
		q=NULL;
	}
	else
		printf("删除失败!!!\n");		
	
}

sort(pnode phead,int sum)//排序
{
	int i,j;
	pnode p,q;
	for(i=0,p=phead->next;p->next;p=p->next,i++)
		for(j=i+1,q=p->next;j<sum;q=q->next,j++)
		{
			if(p->data>q->data)
			{
				q->data^=p->data;
				p->data^=q->data;
				q->data^=p->data;
			}
		}
		
		return;
}

del(pnode p)
{
	pnode temp;
	while(p)
	{
		temp=p;
		p=p->next;
		free(temp);
	}
	return;
}

int main(void)
{
	pnode phead=NULL;//链表头节点指针
	int sum=0;//链表长度
	phead=creat();//创建链表
	//insert(phead,4,55);//在第四节点的位置插入值为55的节点
	//remove(phead,3);//删除第三节点
	//(sum=read(phead))?sort(phead,sum):printf("链表为空!无法排序\n");//对链表进行排序
	print(phead)?printf("完毕!!!\n"):printf("链表为空!!!\n");//读取链表值和长度
	//del(phead);//删除整个链表
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值