c 语言:一个链表的实现

本文介绍了使用C语言实现链表的基本操作,包括创建链表、插入元素、删除元素、冒泡排序、查找元素和获取指定位置元素。此外,还讨论了C语言中函数参数传递和循环语法的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

typedef int ElementType;
typedef int BOOL;

#define TRUE 1
#define FALSE 0

inline BOOL compare(int a,int b,BOOL flag)
{
  if(( a > b && !flag)||( a < b && flag))
     return TRUE;
  else
     return FALSE;
}
typedef struct LNode
{
  ElementType data;
  struct LNode * next;
} LinkList;

LinkList * CreateList()
{
  LinkList * L;
  LinkList * r;
  LinkList * s;
  int length;
  ElementType e;

  printf("Please Enter The Length:");
  scanf("%d",&length);

  L = (LinkList *)malloc(sizeof(LinkList));
  L->next = NULL;
  L->data = length; // L的data域储存链表的长度
  r = L;

  printf("Please Enter The Data:");
  int i;
  for(i = 0;i < length;i++)
  {
    s = (LinkList *)malloc(sizeof(LinkList));
    scanf("%d",&e);
    s->data = e;
    r->next = s;
    r = s;
  }

  r->next = NULL;
  return L;
}
void ListInsert(LinkList * L)
{
  ElementType e;
  int position;

  printf("Please Enter The Insert Position:");
  scanf("%d",&position);

  if(position > L->data + 1 ||position < 0)
    { printf("Illgal Insert Position !\n"); return;}

  printf("Please Enter The Data To Insert:");
  scanf("%d",&e);

  LinkList * p = L;
  LinkList * s;
  s = (LinkList *)malloc(sizeof(LinkList));
  s->data = e;
  int i;
  for( i = 0;i < position - 1;i++)
      p = p->next;
  s->next = p->next;
  p->next = s;
  L->data++; // L的长度增加1
}

void ListDelete(LinkList * L)
{ int position;
  printf("Please Enter The Delete Position");
  scanf("%d",&position);

  if(position > L->data||position < 0)
  {printf("Illgal Delete Position !\n"); return;}
  LinkList * p = L;
  LinkList * r = p;
  int i;
  for( i = 0; i < position -1;i++)
     p = p->next;
  r = p->next;
  p->next = r->next;
  free(r);
  L->data--; //L的长度减小1
}

void BubbleSort(LinkList * L)
{
  if(L->data <= 1)
  return;

  LinkList * pre;
  LinkList * p;
  LinkList * s;
  int i,j;
  BOOL flag,change;
  printf("Please Choice up Or down: ");
  scanf("%d",&flag);
  for( i = 0; i < L->data - 1; i++)
     {
        pre = L;
          p = pre->next;
          s = p->next;
       change = FALSE;
       for( j = 0; j < L->data - i -1; j++)
       {

          if(compare(p->data,s->data,flag))
            {
               pre->next = s;
               p->next = s->next;
               s->next = p;
               change = TRUE;
            }

        pre = pre->next;
          p = pre->next;
          s = p->next;
       }

       if(!change) break;

     }
}

int FindElement(LinkList * L)
{
  ElementType e;
  printf("Please Enter The Element To Find:");
  scanf("%d",&e);

  LinkList * p = L;
  int i = 0;
  while(p != NULL&&p->data != e)
  {
    p = p->next;
    i++;
  }
  if( i > L->data)
    return -1;
  else
    return i;

}

BOOL GetElement(LinkList * L,ElementType * eptr)
{
  int position;

  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;


  if(position < 0|| position > L->data)
  {
     printf("Illegal Position Entered!\n");
    return FALSE;

  }
  else

   { int i;
     for( i = 0; i < position; i++)
        p = p->next;

     *eptr = p->data;

    return TRUE;
   }

}
/*
ElementType * GetElement(LinkList * L)
{
  int position;
  ElementType * eptr;
  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;
  if(position < 0|| position > L->data)
   {
     printf("Illegal Position Entered!\n");
     exit(0);
   }
  else
   {  int i;
      for( i = 0; i < position; i++)
        p = p->next;
     *eptr = p->data;
     return eptr;

   }
}

BOOL GetElement(LinkList * L,ElementType ** eptr)
{
  int position;

  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;
  if(position < 0|| position > L->data)
   {
     printf("Illegal Position Entered!\n");
     return FALSE;
   }
  else
   {  int i;
      for( i = 0; i < position; i++)
        p = p->next;
     *eptr = &(p->data);
     return TRUE;

   }
}

*/

void DisplayList(LinkList * L)
{
  LinkList * p = L->next;
  printf("The Length Of The LinkList is:%d\n",L->data);
  while(p!=NULL)
  {
    printf("%d ",p->data);
    p = p->next;
  }

}

void DistroyList(LinkList * L)
{
  LinkList * p = L->next;
  LinkList * pre = L;
  while(p!=NULL)
  {
    free(pre);
    pre = p;
    p = p->next;
  }
  free(pre);

}

int main()
{
  LinkList * linklist =  CreateList();
  int  choice;

  while(choice != -1)
  {

    printf("Please Enter Choice:1.Insert 2.Delete 3.Display 4.Bubble Sort 5.FindElement 6.GetElement -1.Quit\n");
    scanf("%d",&choice);
    switch(choice)
    {
     case 1:printf("Insert\n");ListInsert(linklist);break;
     case 2:printf("Delete\n");ListDelete(linklist);break;
     case 3:printf("Display\n");DisplayList(linklist);break;
     case 4:printf("BubbleSort: 0 up   1 down\n");BubbleSort(linklist);break;
     case 5:printf("FindElement:\n");printf("%d", FindElement(linklist));break;
     case 6:printf("GetElement:\n");ElementType  e; if(GetElement(linklist,&e)) printf("%d",e);break;
     case -1:printf("Quit\n");break;
     default:
            printf("Please Enter A Leagal Choice!\n");
            break;
    }
   printf("\n");
 }
 DistroyList(linklist);

  return 0;
}

/* 写程序时的一些收获

  1.c语言函数没有引用传递,只能按值传递。在函数内的指针操作比C++要复杂。
  2.for(int i = 0;i < length;i++) 这种写法在C89下无法编译通过。
  3.if(length <= 1); if条件语句后多加一个分号,等同于空语句,编译器不会报错。
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值