C语言实现单链表的生成打印查找删除逆置排序



#include<stdio.h>
#include <stdlib.h>

struct Node
{
 int num;
 struct Node *pNext;
};
struct Node *head=NULL;

void AddNode(int value)//从头结点开始加入节点
{
 struct Node *p;
 p=(struct Node *)malloc(sizeof(struct Node));
 if (p==NULL)
 {
  printf("分配内存失败");
 }
 p->num=value;
 p->pNext=head;
 head=p;
}

void Printall()//打印链表数据
{
 struct Node *p=head;
 while(p!=NULL)
 {
  printf("%d\t",p->num);
  p=p->pNext;
 }
}

void Delete(int value)//删除链表中数据(本函数可以删除链表中与value值相等的所有数据)
{
 struct Node *curr=head;
 struct Node *prev=NULL;
 while (curr!=NULL)
 {
  if (curr->num==value)
  {
   if (curr==head)
   {
    head=curr->pNext;
    free(curr);
    curr=head;
    //加break可以保证只对相同数据删除一次
   }
   else
   {
    prev->pNext=curr->pNext;
    free(curr);
    curr=prev->pNext;
    //加break可以保证只对相同数据删除一次
   }
  }
  else
  {
   prev=curr;
   curr=curr->pNext;
  }
 }
}

void Reverse()//逆置链表
{
 if (head==NULL)
 {
  printf("链表为空");
 }
 else if (head->pNext==NULL)
 {
  printf("链表只有一个节点");
 }
 else
 {
  struct Node *p1,*p2,*p3;
  p1=head;
  p2=p1->pNext;
  while(p2!=NULL)
  {
   p3=p2->pNext;
   p2->pNext=p1;

   p1=p2;
   p2=p3;
  }
  head->pNext=NULL;
  head=p1;
 }
}

void Sortlist()//冒泡排序,对链表进行排序
{
 struct Node *p1;
 struct Node *p2;
 for (p1=head;p1!=NULL;p1=p1->pNext)
 {
  for (p2=head;p2!=NULL;p2=p2->pNext)
  {
   if ((p1->num) < (p2->num))
   {
    p1->num = (p1->num) ^ (p2->num);
    p2->num = (p1->num) ^ (p2->num);
    p1->num = (p1->num) ^ (p2->num);
   }
  }
 }
  Printall();

}

void main1()
{
 AddNode(1);
 AddNode(2);
 AddNode(3);
 AddNode(4);
 AddNode(5);
 Printall();
 printf("\n");
 Sortlist();
 
 //Reverse();
 //Printall();
 //printf("\n");

 //Delete(5);
 //Printall();
 //printf("\n");

 //Delete(1);
 //Printall();
 //printf("\n");

 system("pause");

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值