链表的动态建立,输出,排序,查找,插入,删除,释放,求长度

#include<stdio.h>
#include<stdlib.h>
struct data
{
	int num;
	struct data *next;
};
typedef struct data dt;
dt *creat()   //建立链表 
{
	dt *head,*p1,*p2;
	p1=p2=(dt *)malloc(sizeof(dt));
	printf("Please enter the data:\n");
	scanf("%d",&p1->num);
	head=NULL;
	while(p1->num!=-1)
	{
		if(head==NULL) head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(dt *)malloc(sizeof(dt));
		scanf("%d",&p1->num);
	}
	p2->next=NULL;
	return head;
}
dt sort(dt *head)  //升序排序 
{
	dt *p1,*p2,*p;
	int t;           //定义整型变量 
	p2=p=head;       //p2,p指向第一个节点 
	p1=head->next;   //p1指向第二个节点 
	while(p->next!=NULL)  //注意判断条件 
	{
		do{
			if(p1->num<p2->num){
				p2=p1;            //p2指向本次循环中最小的数 
			}				
			p1=p1->next;          //p1从第二个节点开始向后移 
		}while(p1!=NULL);  //注意判断条件
		t=p2->num;         //p2指向的数与本次循环的第一个数交换
		p2->num=p->num;    // 
		p->num=t;          //
		p2=p=p->next;      //p2,p均向后移 
		p1=p->next;        //p1移到p2紧挨着p2后面的一个节点 
	}
}
dt *delet(dt *head)  //删除节点,删除所有符合条件的节点 
{
	int i,n,b=0;
	dt *p1,*p2,*pb;                       //定义两个结构体指针变量 
	pb=p1=head;                          //一个指向表头,即要向后移动的指针变量 
	printf("请输入要删除的节点:\n");
	scanf("%d",&n);
	while(pb!=NULL)                     //遍历链表,用b来记录所要删除节点出现的次数 
	{
		if(pb->num==n)
		b++;
		pb=pb->next;
	}
	for(i=0;i<b;i++)
	{
		while(p1->num!=n&&p1->next!=NULL)     //找到要删除的节点 
	        {
		        p2=p1;                        //p2记住p1之前的节点 
		        p1=p1->next;                 //p1向后移动 
	        }                               //找到,p1指向要删除的节点,p2指向前一个节点;未找到,则p1指向表尾
	    if(p1->num==n)
	        { 
		        if(p1==head) head=p1->next; //删除节点为第一个节点,刷新表头 
		        else p2->next=p1->next;     //删除的节点位于中间和表尾 
	        }
	    pb=p1;
	    p1=p1->next;
		free(pb);                        //从当前符合条件的节点继续向后移,找到第二个节点
	} 
	return head;
}
void list(dt *p)  //输出链表 
{
	do{
		printf("%d\t",p->num);
		p=p->next;
	}while(p!=NULL);
	printf("\n");
 } 
 dt find(dt *p,int m)  //查找节点 
 {
 	int i=0,a=0;
 	while(p!=NULL)
 	{
 		i++;
 		if(p->num==m){
 			a++;
 			printf("链表的第%d个节点: %d\n",i,p->num);
		}
		p=p->next;
	}
	if(a==0)
	printf("未找到!\n"); 
 }
 dt *insert(dt *head,dt *newp)  //插入节点 
 {
 	dt *p1,*p2;
 	p1=head;
 	if(p1==NULL)   //如果是空链表,作为第一个节点插入 
 	{
 		head=newp;
 		newp->next=NULL;
	}
	else //不是空链表 
	while(newp->num>p1->num&&p1->next!=NULL)//默认按升序排列,找插入位置 
	{
		p2=p1;
		p1=p1->next;
	} 
	if(newp->num<=p1->num)//如果为真,则插入节点不在表尾 
	{
		if(p1==head){     //插在第一个节点之前 
		    head=newp;
		    newp->next=p1;
	    } 
	    else{             //插在p1之前 
		    p2->next=newp;
		    newp->next=p1;
	    }
	}
	else{                 //插在表尾 
		p1->next=newp;
		newp->next=NULL;
	}
	return head;
 }
 int length(dt *p)  //求链表的长度
 {
 	int j=0;
 	while(p!=NULL)
 	{
 		j++;
 		p=p->next;
	}
	printf("链表的长度为: %d",j);
	printf("\n");
 } 
 int main()
 {
 	dt *head,*pd,*newp,*pi,*p1;
 	int m;
 	head=creat();                        //获取链表的头指针 
 	list(head);                          //输出原始链表 
 	printf("Please enter a find num:\n");
	scanf("%d",&m); 	                 //读入要查找的节点 
	find(head,m);                        //查找 
	length(head);                        //求链表长度 
	sort(head);                          //升序排序 
	printf("排序后的链表\n");
	list(head);                          //输出排序后的链表 
	newp=(dt*)malloc(sizeof(dt));        //为插入节点开辟空间 
	printf("请输入要插入的节点:\n"); 
	scanf("%d",&newp->num);              //读入插入节点 
	pi=insert(head,newp);                //插入后刷新表头 
	printf("插入后的链表:\n");
	list(pi);                            //输出插入后的链表 
	pd=delet(head);                      //删除后刷新表头 
	printf("删除后的链表:\n");
	list(pd);                            //输出删除后的链表 
 }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值