QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 961|回复: 6

哪位高手能帮我把这程序改为带尾结点的循环链表?

[复制链接]
发表于 2004-5-31 23:39:28 | 显示全部楼层 |阅读模式
这是带头结点的,根据这程序修改,自己另写也行,但结构体必须是:

[code:1]
typedef struct node
{
    int data;
    struct node *next:
} cyclklist;

cyclklist *rear;
[/code:1]

下面为带头结点的循环链表:
[code:1]
/*带头结点的单循环链表*/
#include <stdio.h>

/********表的定义如下***********/
typedef struct node
{
  int data;
  struct node *next;
} cyclklist;

cyclklist* initiate_cyclklist(void);
cyclklist* create_cyclklist(cyclklist *head);
cyclklist* find_cyclklist(cyclklist *head, int i);
cyclklist* insert_cyclklist(cyclklist *head, int i, int x);
cyclklist* delete_cyclklist(cyclklist *head, int i);

int main (void)
{
  cyclklist *head, *p;
  int count, input;
  head = initiate_cyclklist();
  printf("请输入一些数字(0结束):");
  head = create_cyclklist(head);
  print_cyclklist(head);
  printf("请输入要查找的序号:");
  scanf("%d", &count);
  p = find_cyclklist(head, count);
  printf("第%d号的值为%d\n", count, *p);
  printf("请输入要查找的值:");
  scanf("%d", &input);
  count = locate_cyclklist(head, input);
  printf("该值%d的位置是%d\n", input, count);
  printf("请输入要插入的位置和数字:");
  scanf("%d %d", &count, &input);
  head = insert_cyclklist(head, count, input);
  print_cyclklist(head);
  printf("请输入要删除的位置:");
  scanf("%d", &count);
  head = delete_cyclklist (head, count);
  print_cyclklist(head);
  count = length_cyclklist(head);
  printf("\n线性链表的带头结点的单循环链表长为%d\n", count);
  return 0;
}

/*************初始化运算***************/
cyclklist* initiate_cyclklist (void)
{
  cyclklist *head;
  head = (cyclklist *) malloc (sizeof(cyclklist));
  return (head);
}

/***************创建表运算*******************/
cyclklist* create_cyclklist (cyclklist *head)
{
  cyclklist *new, *end;
  int x;
  end = head;
  scanf("%d", &x);
  while (x != 0)
    {
      new = (cyclklist *) malloc (sizeof(cyclklist));
      new -> data = x;
      end -> next = new;
      end = new;
      scanf("%d", &x);
    }
  end -> next = head;
  return (head);
}

/**********显示列表运算*************/
int print_cyclklist (cyclklist *head)
{
  cyclklist *p;
  int j = 1;
  p =head;
  printf("最新的排列:\n");
  if (head != null)
    {
      p = p -> next;
      while (p != head)
{
   printf("(%d):", j);
   j++;
   printf("%d ", p -> data);
   p = p -> next;
}
    }
  printf("\n");
}

/***********查找运算(读表元)*******************/
cyclklist* find_cyclklist (cyclklist *head, int i)
{
  cyclklist *p;
  int j = 0;
  p = head;
  while ((p -> next != head) && (j < i))
    {
      p = p -> next;
      j++;
    }
  if (i == j)
    return (p);
  else
    {
      printf("\n该位置不存在!\n");
      return 0;
    }
}

/**************定位运算(按值查找)************/
int locate_cyclklist (cyclklist *head, int x)
{
  cyclklist *p;
  int j = 0;
  p = head;
  while ((p -> next != head) && (p -> data != x))
    {
      p = p -> next;
      j++;
    }
  if (p -> data == x)
    return (j);
  else
    {
      printf("\n查无此值!\n");
      return 0;
    }
}

/************************插入运算**************************/
cyclklist* insert_cyclklist (cyclklist *head, int i, int x)
{
  cyclklist *p, *s;
  p = find_cyclklist(head, i - 1);
  if (p == null)
    {
      printf("不存在第%d个位置!\n", i);
      return 0;
    }
  else
    {
      s = (cyclklist *) malloc (sizeof(cyclklist));
      s -> data = x;
      s -> next = p -> next;
      p -> next = s;
    }
  return (head);
}

/*********************删除运算***********************/
cyclklist* delete_cyclklist (cyclklist *head, int i)
{
  cyclklist *p, *s;
  p = find_cyclklist(head, i - 1);
  if ((p != null) && (p -> next != null))
    {
      s = p -> next;
      p -> next = s -> next;
      free (s);
    }
  else
    {
      printf("\n不存在第%d个位置!\n", i);
      return 0;
    }
  return (head);
}

/***********求表长运算***************/
int length_cyclklist (cyclklist *head)
{
  int j = 0;
  cyclklist *p;
  p = head;
  while (p -> next != head)
    {
      p = p -> next;
      j++;
    }
  return (j);
}

[/code:1]
 楼主| 发表于 2004-5-31 23:44:14 | 显示全部楼层
顺便问一个问题.返回值为 cyclklist* 为什么?而不是int呢
回复

使用道具 举报

发表于 2004-6-1 00:11:16 | 显示全部楼层
当然要返回指针了,不然怎好对链表操作?
这次的代码就比上次规范,阅读起来就毫不费力了。
尾结点跟头结点一样简单,若明天有空我可写例子给你。
回复

使用道具 举报

发表于 2004-6-1 00:29:16 | 显示全部楼层
这种东西我倒是很在行;-)
不过既然有人要给你写,我也就不写了
呵呵,明天还要考试,郁闷呀
回复

使用道具 举报

 楼主| 发表于 2004-6-2 18:27:51 | 显示全部楼层
:neutral:
回复

使用道具 举报

发表于 2004-6-9 18:09:47 | 显示全部楼层
看懂了这个就会了,http://sarien.sourceforge.net/sourcedoc/list_8h-source.html
回复

使用道具 举报

发表于 2004-6-9 18:18:46 | 显示全部楼层
这个清晰些。
[code:1]
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct node
{

  int info;

  struct node *prev, *next;

}
*head, *tail;

typedef struct node node;

typedef node *nodep;


int size = 0;

void
ins_node (void)
{

  int ch;
  nodep temp = (nodep) malloc (sizeof (node));

  temp->prev = temp;
  temp->next = temp;

  printf ("\nENTER DATA: ");
  scanf ("%d", &temp->info);

  if (size == 0)
    {
      head = temp;
      tail = temp;
      size = 1;
    }

  else
    {
      printf ("\nENTER POSITION: ");
      scanf ("%d", &ch);

      if (ch > size + 1)
        {
          printf ("\nCANNOT INSERT");
          return;
        }

      if (ch == 1)
        {
          temp->next = head;
          head->prev = temp;
          head = temp;
        }

      else if (ch == size + 1)
        {
          temp->prev = tail;
          tail->next = temp;
          tail = temp;
        }

      else
        {
          nodep pre, cur = head;
          while (--ch)
            {
              pre = cur;
              cur = cur->next;
            }
          pre->next = temp;
          cur->prev = temp;
          temp->next = cur;
          temp->prev = pre;
          pre = NULL;
          cur = NULL;
        }

      size++;
    }
}

void
del_node (void)
{

  int ch;

  if (size == 0)
    {
      printf ("\nLIST EMPTY");
      return;
    }

  else if (size == 1)
    {
      free (head);
      head = NULL;
      tail = NULL;
      size--;
      return;
    }

  else
    {
      nodep pre, cur, nex;
      printf ("\nENTER POSITION: ");
      scanf ("%d", &ch);

      if (ch > size + 1)
        {
          printf ("\nCANNOT DELETE");
          return;
        }

      if (ch == 1)
        {
          cur = head;
          head = head->next;
          head->prev = head;
          free (cur);
          cur = NULL;
          size--;
          return;
        }

      else if (ch == size + 1)
        {
          cur = tail;
          tail = tail->prev;
          tail->next = tail;
          free (cur);
          cur = NULL;
          size--;
          return;
        }

      else
        {
          cur = head;
          while (--ch)
            {
              pre = cur;
              cur = cur->next;
            }
          nex = cur->next;
          pre->next = nex;
          nex->prev = pre;
          free (cur);
          cur = NULL;
          pre = NULL;
          nex = NULL;
          size--;
        }
    }
}

void
display (void)
{
  nodep cur = head;
  int count = size;
  printf ("\n\n");
  if (size == 0)
    {
      printf ("\nLIST EMPTY\n\n");
      return;
    }

  while (count--)
    {
      printf ("%d\t", cur->info);
      cur = cur->next;
    }
  printf ("\n\n");
}


void
main ()
{

  do
    {
      int choice;
      printf ("\nMENU\n");
      printf ("\n1 : DISPLAY");
      printf ("\n2 : INSERT");
      printf ("\n3 : DELETE");
      printf ("\n4 : EXIT");
      printf ("\n\nENTER CHOICE: ");
      scanf ("%d", &choice);

      switch (choice)
        {
        case 1:
          display ();
          break;
        case 2:
          ins_node ();
          break;
        case 3:
          del_node ();
          break;
        case 4:
          exit (1);
        default:
          printf ("\nINVALID CHOICE");
        }
    }
  while (1);
}
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 06:12 , Processed in 0.068415 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表