汇编网首页登录博客注册
chinatree的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2011-10-13 16:56] C语言单链表

#include <stdio.h>
#include <malloc.h>
#include <dos.h>
typedef struct ABC
{
   int a;
   struct ABC * next;
}ST,*pST;
int x;

pST create()               /*创建*/
{
   pST none;
   none=(pST)malloc(sizeof(ST));/*分配内存*/
   if (none==NULL)
   {  
      printf("memory full");/*为空分配失败*/
      sleep(1);
      exit (-1);     /*退出程序*/
   }
   else
   none->next=NULL;
   return none;         /*返回节点的地址*/
}
void input(pST none)             /*在链表尾部添加一个节点*/
{
   extern x;         /*x是节点的个数*/        
   int i=x;
   pST pNEW;                   
   while(i--)
    none=none->next;   /*寻找到最后一个节点*/
   pNEW=create();
   none->next=pNEW;        /*添加*/
   printf("please input a number\n");
   scanf("%d",&(pNEW->a));
   printf("      OK        %d",++x);
   sleep(1);            /*延时1秒*/
   return ; 
}
void deleted(pST none)        /*从末尾删掉一个*/
{
   extern x;
   pST mm;
   int m=x-1;
   if(none->next==NULL||x==0) /*不允许是头接点被删*/
      printf("delete fail\n");
   else
   {
      while(m--)
         none=none->next;    /*寻找到倒数第2个节点*/
      mm=none->next;
      m=mm->a;
      free(none->next);    /*找到倒数第2个节点后用它释放最后一个节点*/
      none->next=NULL;
      printf(" delete:%d     OK        %d\n",m,--x);
    }
    sleep(1);
   return ;
}
void findinput(pST none)      /*表内任意位置插入*/
{
   extern x;
   int i,j;
   pST pnew;         /*定义一个新节点*/
   printf("where input\n");
   scanf("%d%d",&i,&j);
   /*setbuf(stdin,NULL); */
   if (i>x||i<0)          
      printf("error number\n");
   else
    {
      while(i--)
       none=none->next;    /*找到那个节点*/
      pnew=create();
      pnew->next=none->next;  /**/
      none->next=pnew;
      printf("please input a number\n");
      /*fflush(stdin);*/
      /*i=10;
      while(i--)bioskey(1);
      scanf("%",&i);       */
      pnew->a=j;
      printf("    OK    number%d\n",++x);
     }
     sleep(1);
     return ;
 }
void finddelete(pST none)        /*表内任意位置删除*/
{
   extern x;
   pST mmm;
   int i;
   printf("where delete\n");
   scanf("%d",&i);      /*得到位置*/
   if (i>x||i<1)
      printf("error number\n");
   else  
    {
      while(--i)
       none=none->next;    /*找到指定位置的上一个节点*/
       i=none->a;
       mmm=none->next->next;  /*中转一下*/
       free(none->next);   /*释放它*/
       none->next=mmm;          
       printf("delete:%d    OK     number%d",i,--x);
     }
     sleep(1);
     return ;
}
void traverse(pST none)             /*遍历输出*/
{
   extern x;
   int i=x;       /*基本所有的操作都是根据x来判断的*/
   while(i--)
   {
      none=none->next;
      printf("%d  ",none->a); /*显示节点的数据*/
    }
    printf("\n   end\n");
    sleep(2);
    return ;
}
void find(pST none)                 /*找到表内任意节点的数据*/
{
   int i,b;
   extern x;
   printf("please input a number\n");  /*这里也是个数,不是节点存储的数据*/
   scanf("%d",&i);
   b=i;
   if(i>x||i<1)
      printf("error number\n");
   else
    {
      while(i--)
         none=none->next;
      printf("No.%d is %d\n",b,none->a);
     }
    sleep(1);
    return  ;
}
void destroy(pST none)           /*销毁除头节点外所有的节点*/
{  
   extern x;
   pST mmm;
   none=none->next;
   while(none!=NULL)
   {
     mmm=none;       /*还是得中转下*/
     none=none->next;
     free(mmm);
    }
    printf("destroy  OK\n");
    x=0;       /*个数置0*/
    sleep(1);
    return ;
}
int main()
{
   int i;
   pST pHEAD;
   pHEAD=create();
   while(1)
  {
   clrscr();
   /*printf("%#X\n",main);*/
   printf("1.add\n");
   printf("2.sub\n");
   printf("3.insert\n");
   printf("4.delete \n");
   printf("5.traverse\n");
   printf("6.find\n");
   printf("7.destroy\n");
   printf("8.number\n");
   printf("ESC exit\n");
   i=getch();
   if(i==0x1b)free(pHEAD);break;    /*ESC退出*/
   switch(i)
   {
      case 0x31:
   input(pHEAD);break;
      case 0x32:
        deleted(pHEAD);break;
      case 0x33:
   findinput(pHEAD);break;
      case 0x34:
        finddelete(pHEAD);break;
      case 0x35:
   traverse(pHEAD);break;
      case 0x36:
      find(pHEAD);break;
      case 0x37:
        destroy(pHEAD);break;
      case 0x38:
        printf("      %d      ",x);break;
      default:printf("number error!!!\n");   
    }
  }
  return 0;
}
评论次数(0)  |  浏览次数(788)  |  类型(默认类型) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码