优先链表问题;

#define ERROR 0
#define OK 1
#define WR -1

//结构体定义
typedef struct DNode {
    int data, freq;
    struct DNode *prior, *next;
} DNode, *DoubleList;
/*
  TODO:当在在链表上进行一次查找操作Locate(L, x)时,
  令元素值为x的结点中的freq域的值增加1,
  并使此链表中的结点保持按访问频度域递减的顺序排列,
  以便使频繁访问的结点总是靠近表头。
  !注意:禁止在验证时使用输出函数显示
 */
void Locate(DoubleList L, int x) {        //在选择菜单的限制
    DNode *p, *q;
    DNode *p1;
    int te,;
    p = L->next; // 首元素;
    p1=L->next; 
    te = 0; // flag 来表示是否找到;
         //查找
         
     while (p!=NULL && p->data != x)
            p = p->next;
        // 
          if(p==NULL)
          {
                  `printf("未能找到\n");`      
          }
     else {
             (p->freq)++; // 频度增加;
              printf("已查找到数据“%d”\n当前数据的频度为:%d\n", x, p->freq);
            //将频度高的置前
            //TODO:
              q=p; // 存放p,节点;
            // 删除p;
            q->next->prior=q->prior;   
            q->prior->next=q->next ;
            //找到合适的位置插入 ,递减顺序;
              while(p1 && p1->freq > q->freq)  //找到第一个比q->freq 小的位置;
                 p1=p1->next;
                  // 找到;  
                  p1->prior->next=q;
                  q->prior=p1->prior;
                  q->next=p1;
                 p1->prior=q;     
        }
    
}

建立链表的代码

DoubleList CreateDCList(DoubleList L) {
    DNode *p, *q;
    int r = 0;
    char yorn;
    printf(" *****插入菜单*****\n");
    q = L;
    printf("| 当前数据个数为:%d |\n", L->data);        //新插时没有元素,q指向L
    printf("-->>请输入数据:");
    do {
        p = (DNode *) malloc(sizeof(DNode));        //对p进行内存分配
        if (r) {
            printf("\n--------------------\n");
            printf(" *****插入菜单*****\n");
            printf("\r| 当前数据个数为:%d |\n", L->data);
            printf("-->>请输入数据:");
            r = 0;
        }
        scanf("%d", &p->data);//输入数据;
        //根据以下指示实现双向链表数据插入
        //TODO:
        //频度置零
         p->freq=0;
        //q为当前的最后一个
        //将p接在q之后即可
          p->next=NULL;
          q->next=p;
          p->prior=q;
        //双链表L只是一个头节点的作用//不存数据;
            p->next = L->next;
            L->next->prior = p;
          //需要处理最后一个于头结点的联系
     
        //q始终指向最后一个元素
          q=p;
        //将链表长度置于头结点中
          L->data++;
        while (getchar() == ' ')
            ;        //清空格,不知道有多少个,直接这样清了
        printf("是否继续输入(y/n):");        //这样写会使表内只有一个元素时前后都指向自己
        scanf("%c", &yorn);        //而L的前继会始终指向L!!!
        r = 1;
    } while (yorn == 'y');
    printf("\n\n| >-输-入-结-束-<  |\n");
    return L;
}
输入应该没有问题

这段代码哪有问题 ?, 能够找到对应的节点,
在删除非第一个元素时就会不正常停止,应该是指针的指指向出错了或者是形成了死循环 ,但不晓的是哪里有问题,
希望解释一下 ,它完成了链表内部的排序了吗;帮我改改

阅读 840
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进