求各路大神帮我看看这个双向链表的程序,怎么怎么调都不对
题目设有一个双链表,每个结点中除有prior,next及data〔可设为正整数〕三个域之外,还有一个专门记录访问该结点次数的数据域freq,其值在初始化时为零。每当在链表中进行一次Search〔L,key〕时,则数据域data之值等于key的结点,其freq域之值将加1。并使该双链表中结点按freq之值的递减顺序排列,freq值越大的结点越靠近表头。请编写符合上述要求的Search〔L,key〕程序。
设计要求:在程序中构造三个子程序分别为
DLinkedList Creat() /*建立链表*/
void Search(DLinkedList head,int key) /*查找链表中符合要求的结点*/
void print(DLinkedList head); /*输出链表中的结点*/
先谢谢了
我的代码:
#include<stdio.h>
#define N 5
#define NULL 0
typedef struct DLNode{
int data;
int freq;
struct DLNode *prior;
struct DLNode *next;
}DLNode,*DLinkedList;
DLinkedList create(int n)
{
int i,elem;
DLinkedList s,p,head;
head=(DLinkedList)malloc(sizeof(DLNode));
head->next=NULL;
s=head;
for(i=0;i<n;i++)
{
p=(DLinkedList)malloc(sizeof(DLNode));
scanf("%d",&elem);
p->data=elem;p->freq=0;
s->next=p;p->prior=s;
s=p;
}
s->next=NULL;
return head;
}
void search(DLinkedList head, int key)
{
DLinkedList p,s,head,k;
s=head;p=s->next;
while(p)
{ if(p->data==key)
{p->freq++;
p=p->next;}
else
p=p->next;
}
s=head;
p=s->next;
p->next=k;
while(p)
{if(p->freq<k->freq)
{s->next=k;k->prior=s; k->next=p; p->prior=k;
k=s;p->next=k;}
else{p=s;k=p;p->next=k;k->prior=p;}
}
}
void print(DLinkedList head)
{
DLinkedList p;
p=head->next;
while(p)
{ printf("elem=%d " , p->data);
printf("pingdu=%d\n", p->freq);
p=p->next;
}
}
int main()
{
DLinkedList head;
int key,i;
head=create(N);
printf("the list is:\n" );
print(head);
for(i=0;i<N;i++)
{
printf("input the elem:\n");
scanf("%d",&key);
search(head,key);
print(head);
}
getch();
return 0;
}