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