循环链表

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

typedef struct Clinklist//struct关键字,定义的一个“结构类型” Clinjlist是结构名
{
    int data;  //数据域
    struct Clinklist *next;//指针域

}node;//定义结构变量node,对成员的访问可以用例如node.data
void ds_init(node **pNode)//*pNode为一结点、、、、、、、、、、。。。  **pNode 表示元素
/*两个星号叫做“二级指针”,意思就是指向指针的指针。
如果是一级指针,node *Pr,那么Pr是指向一个node结构,而node **Pr2,那么Pr2指向一个指针,而那个指针又指向一个node结构。*/
{
    int item;
    node *temp;//定义两个结点
    node *target;
    printf("输入结点的值,输入0完成初始化\n");
    while(1)
    {
        scanf("%d",&item);
        fflush(stdin);//清空输入缓冲区
        if(item==0)
          return ;//return ;和break;都可以跳出循环,终止
        if((*pNode)==NULL)//若成立,循环链表中只有一个结点,*pNode表示地址,地址不为空则执行下去

          {

            {
                *pNode=(node*)malloc(sizeof(struct Clinklist));//动态分配结点类型,因为node *temp,sizeof后为分配单位

                if(!(*pNode))//如果pNode为空,则!pNode为真,会执行下去
                     exit(0);   //退出程序并返回一个0值
                (*pNode)->data=item;//不用退出时,执行的语句
                (*pNode)->next=*pNode;//就是循环起来建立链表
            }
          }
            else
            {
                //找到next 指向第一个结点的结点
                for(target=(*pNode);target->next!=(*pNode);target=target->next)//中间那个就是相当于判断head->next!=head,直到head->next=head时终止
                          ;   // target 是最后一个结点,尾部 指向pNode第一个结点,都是在最尾部插入,怎样判断最尾部
                temp=(node*)malloc(sizeof(struct Clinklist));
                if(!temp)
                   exit(0);//如果生成失败则退出
                temp->data=item;
                temp->next=*pNode;//指向第一个结点,说明是一个循环
                target->next=temp;//第一次确定头部就是temp
            }

    }

}
  //插入结点
void ds_insert(node **pNode,int i)
  {
      node  *temp;
      node *target;
      node *p;
      int item;
      int j=1;
      printf("输入要插入结点的值");
      scanf("%d",&item);
      if(i==1)//新插入结点作为一个结点
      {
          temp=(node*)malloc(sizeof(struct Clinklist));
          if(!temp)
           exit(0);
           temp->data-item;//寻找最后一个结点
           for(target=(*pNode);target->next!=(*pNode);target=target->next)
              ;
            temp->next=(*pNode);
            target->next=temp;
            *pNode=temp;

      }
      else
      {
          target=*pNode;
          for(;j<i-1;j++)
          {
              target=target->next;
          }
          temp=(node*)malloc(sizeof(struct Clinklist));
          if(!temp)
            exit(0);//  ?????????????????????????????
            temp->data=item;
            p=target->next;
            target->next=temp;
            temp->next=p;
      }
  }
  void ds_delete(node **pNode,int i)
{
    node *target;
    node *temp;
    int j=1;
    if(i=1)//s删除第一个结点,找到最后一个
    {
        for(target=*pNode;target->next!=*pNode;target=target->next)
        temp=*pNode;
        *pNode=(*pNode)->next;
        target->next=*pNode;
        free(temp);
    }
    else
    {
        target=*pNode;
        for(;j<i-1;++i)
        {target=target->next;}
         temp=target->next;
         target->next=temp->next;
         free(temp);


    }
}


  int ds_search(node *pNode,int elem)
{
    node *target;
    int i=1;
    for(target=pNode;target->data!=elem&&target->next!=pNode;++i)
    {
        target=target->next;
    }
    if(target->next==pNode)
    //if(target->next==pNode)
    //表中不存在该元素
       return 0;
    else
       return i;
}
void ds_traverse(node *pNode)
{
    node *temp;
    temp=pNode;
    printf("*********************表中元素*************************\n");
    do
    {
        printf("%d\t",temp->data);
    }
    while((temp=temp->next)!=pNode);
    printf("\n");
}
int main()
{
    node *pNode=NULL;
    char opp;
    int find;
    printf("..............\n\n");
    printf("1初始化链表\n\n2插入结点\n\n3删除结点\n\n4返回结点位置\n\n5遍历链表\n\n0退出\n\n请选择操作\n");
    while(opp!="0")
    {
        scanf("%c",&opp);
        switch(opp)
        {
            case '1':
            ds_init(&pNode);
            printf("\n");
            ds_traverse(pNode);
            break;
            case '2':
            printf("输入需要插入结点位置");
            scanf("%d",&find);
            ds_insert(&pNode,find);
            printf("在位置%d插入值后:\n",find);
            ds_traverse(pNode);
            printf("\n");
            break;
            case'3':
            printf("输入需要删除结点的位置");
            scanf("%d",&find);
            ds_delete(&pNode,find);
            printf("删除第%d个结点后:\n",find);
            ds_traverse(pNode);
            printf("\n");
            break;
            case '4':
            printf("你要查找倒数第几个结点的值");
            scanf("%d",&find);
            printf("元素%d所在位置为%d\n",find,ds_search(pNode,find));
            printf("\n");
            break;
            case'5':
            ds_traverse(pNode);
            printf("\n");
            break;
            case'0':
            exit(0);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休居士

感谢您的支持,我会继续努!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值