求解数据结构一道题,链表有关问题!
求解数据结构一道题,链表问题!!
题目要求:一个链表三个域:数据、频率、next指针。 然后建表,初始化都为零。然后给链表scanf几个数据,然后用函数找相应的值,找到频率加,否则将其插入到链表尾部。然后显示出来!
下面是我写的源码,求大神修改。
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data; //数据
int fieq; //频率
struct LNode *next; //next指针
}*Linklist ;
void Creat(Linklist &L)
{
L=(Linklist)malloc(sizeof(LNode));
if(!L)
exit(0);
else
L->next=NULL;
printf("构建成功!\n");
}
void FindLNode(Linklist &L,int x)
{
Linklist p,q;
p=L->next;
q=L;
while(p!=NULL)
{
if(p->data==x)
{
p->fieq++;
q->next=p->next; //取出该节点
Linklist r,s;
r=p->next;
s=q;
while(r!=NULL)
{
//重新插入
if(r->fieq<=p->fieq)
{
p->next=s->next;
s->next=p;
}
s=s->next;
r=r->next;
}
}
q=q->next;
p=p->next;
}
if(p==NULL)
{
Linklist s;
s->data=x;
s->fieq=0;
s->next=NULL;
if(L->next==NULL)
{
L->next=s;
s->next=NULL;
}
}
}
void print(Linklist L)
{
Linklist p=L->next;
while(p!=NULL)
{
printf("[%d 出现 %d次]\n",p->data,p->fieq);
p=p->next;
}
}
int main()
{
Linklist a;
printf("构建一个新链表:");
Creat(a);
FindLNode(a,5);
FindLNode(a,1);
FindLNode(a,2);
FindLNode(a,3);
FindLNode(a,4);
FindLNode(a,4);
print(a);
return 0;
}
为什么显示的时候链表a时,只显示如图呢?
------解决思路----------------------
Creat(a)
只是创建一个链表节点,并不是链表
------解决思路----------------------
这段代码,如果p为空,就新建一个结点,然后把L指向它,L作为头结点,每次都指向新建结点,而新建的结点又指向NULL,那你怎么保存原有的结点呢。
------解决思路----------------------
------解决思路----------------------
结点插入好了,这个函数此次使命就完成了,用return结束函数的执行,返回到主函数。
题目要求:一个链表三个域:数据、频率、next指针。 然后建表,初始化都为零。然后给链表scanf几个数据,然后用函数找相应的值,找到频率加,否则将其插入到链表尾部。然后显示出来!
下面是我写的源码,求大神修改。
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data; //数据
int fieq; //频率
struct LNode *next; //next指针
}*Linklist ;
void Creat(Linklist &L)
{
L=(Linklist)malloc(sizeof(LNode));
if(!L)
exit(0);
else
L->next=NULL;
printf("构建成功!\n");
}
void FindLNode(Linklist &L,int x)
{
Linklist p,q;
p=L->next;
q=L;
while(p!=NULL)
{
if(p->data==x)
{
p->fieq++;
q->next=p->next; //取出该节点
Linklist r,s;
r=p->next;
s=q;
while(r!=NULL)
{
//重新插入
if(r->fieq<=p->fieq)
{
p->next=s->next;
s->next=p;
}
s=s->next;
r=r->next;
}
}
q=q->next;
p=p->next;
}
if(p==NULL)
{
Linklist s;
s->data=x;
s->fieq=0;
s->next=NULL;
if(L->next==NULL)
{
L->next=s;
s->next=NULL;
}
}
}
void print(Linklist L)
{
Linklist p=L->next;
while(p!=NULL)
{
printf("[%d 出现 %d次]\n",p->data,p->fieq);
p=p->next;
}
}
int main()
{
Linklist a;
printf("构建一个新链表:");
Creat(a);
FindLNode(a,5);
FindLNode(a,1);
FindLNode(a,2);
FindLNode(a,3);
FindLNode(a,4);
FindLNode(a,4);
print(a);
return 0;
}
为什么显示的时候链表a时,只显示如图呢?
------解决思路----------------------
Creat(a)
只是创建一个链表节点,并不是链表
------解决思路----------------------
if(p==NULL)
{
Linklist s;
s->data=x;
s->fieq=0;
s->next=NULL;
if(L->next==NULL)
{
L->next=s;
s->next=NULL;
}
}
这段代码,如果p为空,就新建一个结点,然后把L指向它,L作为头结点,每次都指向新建结点,而新建的结点又指向NULL,那你怎么保存原有的结点呢。
------解决思路----------------------
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data; //数据
int fieq; //频率
struct LNode *next; //next指针
}*Linklist ;
void Creat(Linklist &L)
{
L=(Linklist)malloc(sizeof(LNode));
if(!L)
exit(0);
else
L->next=NULL;
printf("构建成功!\n");
}
void FindLNode(Linklist &L,int x)
{
Linklist p,q;
p=L->next;
q=L;
//你的写法和你的要求不相符啊,频率高的在前,应该从前往后比呀
while(p!=NULL)
{
if(p->data==x)
{
p->fieq++;
q->next=p->next; //取出该节点
Linklist r,s;
r=L->next;
s=L;
while(r->next!=p)
{
//重新插入
if(r->fieq<p->fieq)
{
s->next=p;
p->next=r;
return;
}
s=s->next;
r=r->next;
}
}
q=q->next;
p=p->next;
}
if(p==NULL)
{
Linklist s=(Linklist)malloc(sizeof(LNode));//没初始化就用,运行竟然没崩溃?
s->data=x;
s->fieq=0;
s->next=NULL;
if(L->next==NULL)
{
L->next=s;
s->next=NULL;
}
//新加的,不然新结点怎么添加
else
{
q->next=s;
s->next=NULL;
}
}
}
void print(Linklist L)
{
Linklist p=L->next;
while(p!=NULL)
{
printf("[%d 出现 %d次]\n",p->data,p->fieq);
p=p->next;
}
}
int main()
{
Linklist a;
printf("构建一个新链表:");
Creat(a);
FindLNode(a,5);
FindLNode(a,1);
FindLNode(a,2);
FindLNode(a,5);
FindLNode(a,3);
FindLNode(a,4);
FindLNode(a,4);
FindLNode(a,3);
FindLNode(a,3);
print(a);
getchar();
return 0;
}
------解决思路----------------------
结点插入好了,这个函数此次使命就完成了,用return结束函数的执行,返回到主函数。