Asp.net 学习资料

伦惠峰

双链表(C语言版)

#include <stdio.h>
/*******表的定义如下**********/
typedef struct dnote
{
  int data;
  struct dnote *prior;
  struct dnote *next;
} dlklist;
dlklist* initiate_dlklist(void);
dlklist* create_dlklist(dlklist *head);
dlklist* find_dlklist(dlklist *head, int input);
dlklist* insert_dlklist(dlklist *head, int i, int x);
dlklist* delete_dlklist(dlklist *head, int i);
int main (void)
{
  dlklist *head, *p;
  int input, count;
  head = initiate_dlklist();
  printf("请输入一些数字(0结束):");
  head = create_dlklist(head);
  print_dlklist(head);
  printf("请输入要查找的序号:");
  scanf("%d", &count);
  p = find_dlklist(head, count);
  printf("第%d号的值为%d/n", count, *p);
  printf("请输入要查找的值:");
  scanf("%d", &input);
  count = locate_dlklist(head, input);
  printf("该值的位置是%d/n", count);
  printf("请输入要插入的位置和数字:");
  scanf("%d %d", &count, &input);
  head = insert_dlklist(head, count, input);
  print_dlklist(head);
  printf("请输入要删除的位置:");
  scanf("%d", &input);
  head = delete_dlklist(head, input);
  print_dlklist(head);
  count = length_dlklist(head);
  printf("带头节点的双链表的表长为%d/n", count);
  return 0;
}
/***********初始化运算*************/
dlklist* initiate_dlklist (void)
{
  dlklist *head;
  head = (dlklist *) malloc (sizeof(dlklist));
  return (head);
}
/************创建表运算***************/
dlklist* create_dlklist (dlklist *head)
{
  dlklist *new, *end;
  int x;
  end = head;
  scanf("%d", &x);
  while (x != 0)
    {
      new = (dlklist *) malloc (sizeof(dlklist));
      end -> next = new;
      new -> prior = end;
      new -> data = x;
      end = new;
      scanf("%d", &x);
    }
  head -> prior = end;
  end -> next = head;
  return (head);
}
/**********显示列表运算************/
int print_dlklist (dlklist *head)
{
  dlklist *p;
  int j = 1;
  p = head;
  printf("/n从前向后输出表是:/n");
  p = p -> next;
  do
    {
      printf("(%d):", j);
      j++;
      printf("%d ", p -> data);
      p = p -> next;
    }
  while (p != head);
  p = head;
  p = p -> prior;
  printf("/n从后向前的输出表是:/n");
  do
    {
      j--;
      printf("(%d):", j);
      printf("%d ", p -> data);
      p = p -> prior;
    }
  while (p != head);
  printf("/n/n");
}
/************查找运算(读表元)***************/
dlklist* find_dlklist (dlklist *head, int i)
{
  dlklist *p;
  int j = 0;
  p = head;
  while ((p -> next != head) && (j < i))
    {
      p = p -> next;
      j++;
    }
  if (i == j)
    return (p);
  else
    {
      printf("该位置不存在!/n");
      return 0;
    }
}
/*************定位运算(按值查找)***********/
int locate_dlklist (dlklist *head, int x)
{
  dlklist *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;
    }
}
/*****************插入运算***************************/
dlklist* insert_dlklist (dlklist *head, int i, int x)
{
  dlklist *p, *q;
  p = find_dlklist(head, i - 1);
  if (p == NULL)
    {
      printf("不存在第%d个位置!/n", i);
      return 0;
    }
  else
    {
      q = (dlklist *) malloc (sizeof(dlklist));
      q -> data = x;
      q -> prior = p;
      q -> next = p -> next;
      p -> next -> prior = q;
      p -> next = q;
    }
  return (head);
}
/****************删除运算********************/
dlklist* delete_dlklist (dlklist *head, int i)
{
  dlklist *p;
  p = find_dlklist(head, i);
  if ((p != NULL) && (p -> next != NULL))
    {
      p -> prior -> next = p -> next;
      p -> next -> prior = p -> prior;
      free(p);
    }
  else
    {
      printf("不存在第%d个位置!/n", i);
      return 0;
    }
  return (head);
}
/**************求表长运算****************/
int length_dlklist (dlklist *head)
{
  int j = 0;
  dlklist *p;
  p = head;
  while (p -> next != head)
    {
      p = p -> next;
      j++;
    }
  return (j);
}
 

posted on 2007-08-13 21:40  伦惠峰  阅读(380)  评论(0)    收藏  举报

导航