⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklistb.c

📁 数据结构实验与学习指导
💻 C
字号:
/* linklistb.c */
#include"linklist.c"/*调用单链表的建立和输出子程序文件*/
LinkList Get_LinkList(LinkList H, int k)
{/*在单链表中按序号查找第 k 个数据元素,找到返回其指针,否则返回空*/
LNode  *p=H;
   int  j=0;
while (p->next!=NULL && j<k )
    { p=p->next;  j++;  }
   if (j==k&&j!=0)  return p ;
   else  return NULL;
 }/*Get_LinkList*/
Status Insert_LinkList(LinkList H,int i,ElemType x)
  { /* 在单链表H的第i个位置上插入值为x的元素 */
    LNode  * p,*s;
    p=Get_LinkList(H,i-1);                       /* 查找第i-1个结点 */
    if (p==NULL)
      return ERROR;                            /* 第i-1个结点不存在,不能插入 */
    else {
          s=(LinkList)malloc(sizeof(LNode));     /* 申请、填装结点 */
          s->data=x;
          s->next=p->next;                        /* 新结点插入在第i-1个结点的后面 */
      p->next=s;
      return OK;}
   }/* Insert_LinkList */
Status Delete_LinkList(LinkList H,int i)    /* 删除表序号为i的记录 */
  {LNode *q,*p;
   int j=1;
   q=H;p=H->next;
   while(p&&j<i)
     {q=p;p=p->next;++j;}
      if(i>j) return ERROR;                    /* 输入的序号非法 */
    q->next=p->next;
    free(p);                                      /* 释放空间 */
    return OK;
}/* Delete_LinkList */
void del_linkx(LinkList H,float x)             /* 删除所有成绩域为x的结点*/
{
  LNode  *p,*q; int i=0;
  p=H;  q=H->next;
  while(q!=NULL)
  {
    if(q->Score<x) {
     p->next=q->next; free(q); q =p->next; i++;
     }
   else  {  p=q;  q=q->next;}
  }
   printf("第%d个学生信息被删除了! \n",i);
 }
void  Reverse_L(LinkList  H)                    /*单链表的逆置*/
{ LNode *p,*q,*s;
  p=H->next;
  if (p)
  {                                         /*非空表*/
     q=p->next;
     if (q)                               /*表长大于等于2*/
       { if (q->next)                     /*表长大于2*/
         {s=q->next; p->next=NULL;
          while(s->next)
          {
           q->next=p;p=q;
           q=s;s=s->next;                 /* 把H的元素逐个插入新表表头 */
          }/*while*/
          q->next=p;s->next=q;H->next=s;
     }/*if (q->next) */
        else                              /*表长等于2*/
    {q->next=p;H->next=q;}
    }              }
}/* Reverse_L*/

void  main()
  {int j=1,Num,kk; float score;
   LNode *H,*q;  ElemType x;
   H=Creat_LinkList();
   Print_LinkList(H);
while (j)                                    /*功能菜单*/
{printf("输入0到5的整数选择一个操作:\n");
       printf("1: 查找\n");
       printf("2: 插入\n");
       printf("3: 删除指定编号的节点\n");
       printf("4: 删除成绩等于指定值的学生信息\n");        /*删除所有成绩域为x的结点*/
       printf("5: 逆置\n");
       printf("0: 退出程序\n");
     scanf("%d",&j);
     switch(j)
       {case 0: printf("退出程序!\n");exit(0);
        case 1: printf("请输入查找位置\n");
                  scanf("%d",&i);
          q=Get_LinkList(H,i);
          if (q)
           { printf("查找成功!该学生的信息如下:\n");
printf("num=%d,name=%s,score=%f\n",q->data.Num,q->data.Name,q->
data.Score);}
              else    printf("查找失败! \n");
          break;
    case 2:
      /*首先输入插入位置和待插入的学生信息*/
      printf("请输入一个学生的信息:Num,Name,Score :\n");
      scanf("%d",&num);
      getchar();gets(ss);
      scanf("%f",&score);
      x.Num=num;
      strcpy(x.Name,ss);
      x.Score=score;
      printf("请输入插入位置\n");
              scanf("%d",&i);
      kk=Insert_LinkList(H,i,x);
     if(!kk)
       printf("\n输入的位置无效!\n");
      else
     Print_LinkList(H);break;
        case 3: printf("请输入删除位置(整数)\n");
                 scanf("%d",&i);
         kk=Delete_LinkList(H,i);
         if(!kk)
           printf("\n输入的删除位置无效!\n");
         else
           Print_LinkList(H);break;
        case 4: printf("按成绩删除,请输入这个成绩:\n");
                  scanf("%f",&score);             /*删除所有成绩域为x的结点*/
                  del_linkx(H,score);
                  Print_LinkList(H);break;
        case 5:
       Reverse_L(H);
       printf("逆置结果为:\n");
           Print_LinkList(H);break;
        default: printf("输入无效!请重新输入!\n");  }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -