2023/2/6 双向链表、单向循环链表、双向循环链表

2023/2/6 双向链表、单向循环链表、双向循环链表

作业:

1,实现双向链表按元素删除


//按位置删除,成功返回0,否则返回-1
int DeleteByPos(DoubleLink L,int pos)
{
    if(L->len==0||pos<1||pos>L->len+1)
    {
        return -1;
    }
    DoubleLink p=L;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }
    DoubleLink q=p->next;
    p->next=q->next;
    q->next->prev=p;                              
    free(q);
    q=NULL;
    L->len--;
    return 0;

}

//按元素删除
int DeleteByData(DoubleLink L,datatype e)
{
    if(L->len==0)
    {                                    
        return -1;
    }
    DoubleLink p=L;
    for(int i=1;i<=L->len;i++)
    {
        p=p->next;
        if(strcmp(p->data,e)==0)
        {
            DeleteByPos(L,i);
            return 0;
        }
    }
    return -1;
}

2,实现循环双向链表按位置插入


//按位置插入                                          
void InsertByPos(DoubleLoopLink L,int pos,datatype e)
{   
    if(L==NULL)
    {
        return;
    }
    DoubleLoopLink p=L;
    DoubleLoopLink q=CreateNode();
    for(int i=0;i<pos-1;i++)
    {   
        p=p->next;
    }
    q->data=e;
    q->next=p->next;
    q->prev=p;
    p->next->prev=q;
    p->next=q;
    L->len++;
}


3,实现约瑟夫环


LoopLink CreateHead()

   LoopLink L=(LoopLink)malloc(sizeof(Node));
   if(L==NULL)
   {
       return NULL;
   }
   L->len=0;
   L->next=L;
   return L;


oopLink CreateNode()

   LoopLink p=(LoopLink)malloc(sizeof(Node));
   if(p==NULL)
   {
       return NULL;
   }
   p->data=-1;
   p->next=NULL;
   return p;


oid InsertRear(LoopLink L,datatype e)

   if(L==NULL)
   {
       return;
   }
   LoopLink p=L;
   LoopLink q=CreateNode();
   if(q==NULL)
   {
       return;
   }
   while(p->next!=L)
   {
       p=p->next;
   }
   q->data=e;
   q->next=p->next;
   p->next=q;
   L->len++;


oid LoopLinkShow(LoopLink L)

   if(L->len==0)
   {
       return;
   }
   LoopLink p=L;
   while(p->next!=L)
   {
       p=p->next;                                        
       printf("%d\t",p->data);
   }
   printf("\n");


oid Josepho(LoopLink L,int n,int m)

   int i,j;
   LoopLink p=L;
   for(int i=0;i<n;i++)
   {
       for(j=0;j<m-1;j++)
       {
           p=p->next;
           if(p==L)
           {
               j--;
           }
       }
       LoopLink q=p->next;
       if(q==L)
       {
           q=L->next;
       }
       printf("%d\t",q->data);
       p->next=q->next;
       free(q);
       q=NULL;
       L->len--;
   }
   printf("\n");


4,删除链表中的所有结点.

//释放空间
void LoopLinkFree(LoopLink L)
{
	if(L->len==0)
	{
		return;
	}
	for(int i=0;i<L->len;i++)
	{
		DeleteRear(L);
	}
}

main.c
int main()
{
........
	free(L);
	L=NULL;
	return 0;
}

5,实现单向链表的简单选择排序

 
 //链表选择排序(降序)                
 void LinkSelectSort(Linklist L)
 {
     int i,j;
     datatype temp;
     Linklist p=L;
     for(i=0;i<L->len-1;i++)
     {
         p=p->next;
         Linklist q=p;
         for(j=i+1;j<L->len;j++)
         {
             q=q->next;
             if(p->data < q->data)
             {
                 temp=q->data;
                 q->data=p->data;
                 p->data=temp;
             }
         }
     }
 }
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值