单向循环链表-简单

源程序:

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{

  int data;

  struct node *next;

}linklist;

//创建单向循环链表

linklist *creatlist()

{

  linklist *head, *p, *rear;

  int x;

  head = (linklist *)malloc(sizeof(linklist));

  head->next = NULL;

  rear = head;

  printf("请输入链表内容(整数),以0结束: ");

  scanf("%d", &x);

  while (x)

  {

    p = (linklist *)malloc(sizeof(linklist));

    p->data = x;

    rear->next = p;

    rear = p;

    scanf("%d", &x);

  }

  rear->next = head;//尾指针指向头结点

  return rear;

}

//删除单向循环链表中指定的结点

void delete_key(linklist *rear, int key)

{

  linklist *p, *q;

  int deleted = 0;//用于标记是否删除过

  p = rear->next;

  q = p->next;

  while (q != rear->next)

  {

    if (q->data == key && q != rear)

    {

      p->next = q->next;

      free(q);

      q = p->next;

      deleted = 1;

    }

    else if (q->data == key && q == rear)

    {

      p->next = q->next;

      free(q);

      q = p->next;

      deleted = 1;

    }

    p = q;

    q = q->next;

    /* if(q->data==key && q==rear)  //如果删除的是最后一个结点

    {

      p->next=q->next;

      free(q);

      q=p->next;

      deleted=1;

    }

    */

  }

  if (deleted)

    printf("已删除! ");

  else

    printf("没有找到该结点! ");

}

//输出单循环链表

void print(linklist *rear)

{

  linklist *p;

  printf(" 当前链表如下: ");

  p = rear->next->next;

  while (p != rear->next)

  {

    printf("%5d", p->data);

    p = p->next;

  }

  printf(" ");

}

 int main()

{

  linklist *rear;

  rear = creatlist();

  print(rear);

  //删除循环链表中指定的值

  int k;

  printf("删除循环链表中指定的值");

  scanf("%d", &k);

  delete_key(rear, k);

  print(rear);

  system("pause");

  return 1;

}

 运行结果:

原文地址:https://www.cnblogs.com/duanqibo/p/11841152.html