数据结构 c语言(二)

链表的基本操作

编写一个程序,要求从终端输入一组整数(大于10个数)以0作为
结束标志,将这一组整数存放在一个链表中,打印出该链表中的值,
然后删除链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表

/**编写一个程序,要求从终端输入一组整数(大于10个数)以0作为
  结束标志,将这一组整数存放在一个链表中,打印出该链表中的值,
  然后删除链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表*/


  #include "stdio.h"
  typedef int ElemType;
  typedef struct node {
      ElemType data;
      struct node *next;
  }LNode,*LinkList;


  LinkList creatLinkList(int n)
  {
      LinkList p,r,list=NULL;
      ElemType e;
      int i;
      for(i=1;i<=n;i++)
      {
          scanf("%d",&e);
          p=(LinkList)malloc(sizeof(LNode));
          p->data=e;
          p->next=NULL;
         if(!list)
             list=p;               //list 为头指针
         else
             r->next=p;        //r一直指向链表的末尾指针
         r=p;                 //目的是使r再次指向最后一个节点,以便生成链表的下一个节点
      }
      return list;
  }


  void insertList(LinkList * list,LinkList q,ElemType e){

      LinkList P;
      P=(LinkList)malloc(sizeof(LNode));
      p->data=e;
      if(!*list){
          *list=p;
          p->next=NULL;
      }
      else{
          p->next=q->next;
          q->next=p;
      }
  }


  void delLink(LinkList* list,LinkList q){   //删除链表结点
     LinkList r;
     if(q=*list){
         *list=q->next;
         free(e);
     }
     else{
         for(r=*list;r->next!=q;r=r->next);

         if(r->next!=NULL){
             r->next=q->next;
             free(q);
         }
    }
  }


     void destroyLinkList(LinkList *list)
     {
            LinkList p,q;
            p=*list;
            while(p){

              q=p->next;
              free(p);
              p=q;
            }
      *list=NULL;
     }




int main(){

      int e,i;
      LinkList l,q;
      q=l=creatLinkList(1);
      scanf("%d",&e);
      while(e){
          insertList(&l,q,e);
          q=q->next;
          scanf("%d"&e);
      }
      q=l;
      printf("链表的内容为:\n");
      while(q)
      {
          printf("%d\t",q->data);
          q=q->next;
      }
      q=l;
      printf("\n删除最后的结点\n");
      for(i=0;i<4;i++){
          if(q==NULL){
              printf("链表的长度小于5\n");
              getche();
              return;
          }
          q=q->next;
      }

      delLink(&l,q);// 找到链表的第五个元素,用q指向他,再删除q所指得结点 
      q=l;
      while(q){
          printf("%d",q->data);
          q=q->next;
      }
      destroyLinkList(&l); //销毁这个链表
      getche();
}
'''

----------
 getche():输入后立即从控制台取字符,不以回车为结束(带回显)
           返回输入字符对应的ASCII码


----------


**c语言中getch,getche,getchar的区别**


getchar 是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说 ,如果stdin有数据的话不用输入就可以直接读取了。而getch()和getche()是conio.h中的库函数,它的作用是从键盘接收字符。

getch() 实际是一个输入命令,作用是从键盘接收一个字符,而且并不把这个字符显示出来,就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以我们在C++中可以用它来实现“按任意键继续”的效果,即程序中遇到getch();这行语句,它就会把程序暂停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。

你也许会问,为什么我们在C++中就没有在程序的末尾加上getch(),解释是,软件总是不断更新的,不好的地方当然要进行改正,getch()加在程序末尾,它又不赋值给任何变量,所以它在这个地方完全是垃圾代码,与程序无关。C++中考虑到这一点,于是在每次程序运行完了并不退出,而是自动把屏幕停下来,并显示“press any key...”叫你按任意键退出,这就好比C++在它的环境中运行程序,在程序的末尾自动加上了一行getch();语句,并且在这行语句前还添加了一行输出语句cout<<"press any key...";来提示你程序结束了,按任意键继续。

getche() 和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示。












  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值