关于数据结构(C语言)的几道题~在线等

2024-12-01 05:14:00
推荐回答(2个)
回答(1):

我把这三个小题合到一起写了
关于算法看一下每个函数
简单的
第一题我是先把26插到链表最后
再用一个”正序排列”函数,排列一下
数据递减有序用的是”逆序函数”(其实就是正序里面把>号改成<号就好了,

#include
#include
#include
typedef int ElemType;

typedef struct LNode {
ElemType date;
struct LNode *next;
}linklist,*link;

////////////////////////////////////////////// /////////
// /*插入结点*/////////////// ///////////////////////
int listinsert(link &L,int i,ElemType e)
{
link p,q;int j;
p=L;j=0;
while(p&&j{p=p->next;++j;
}q= (link)malloc(sizeof(LNode));
q->date=e;
q->next=p->next;
p->next=q;
return 1;
} ///////////////////////////////////
/////////////////////////////////////
void show(link l)
{ link p; int j;
p=l;j=0;
cout<<"链表的值为:\n";
while(p->next)
{cout<next->date<p=p->next;
}} ///////////////////////////////////////
////正序排列/////////////////////////////////////////
void putline(link &l)
{if(l==NULL ||l->next==NULL )
cout<<"链表未建立或是空的,请先构造链表\n" ;
else{
link p,q;
p=l->next;
while(p!=NULL)
{ q=p->next;
while(q!=NULL)
{ if(p->date>q->date)
{ ElemType t;
t=p->date;
p->date=q->date;
q->date=t;
} q=q->next;
}
p=p->next;
}}}
///////////////////////////////////////////////
///////////// 逆序排列/ ///////////////
void fputline(link &l)
{
if(l==NULL ||l->next==NULL )
cout<<"链表未建立或是空的,请先构造链表\n" ;
else{
link p,q;
p=l->next;
while(p!=NULL)
{ q=p->next;
while(q!=NULL)
{ if(p->datedate)
{ ElemType t;
t=p->date;
p->date=q->date;
q->date=t;
} q=q->next;
} p=p->next;
}}}

//////////////////////////////////////////////////////////////
int listdelete(link &L,int i,ElemType &e)
{
link p,q; int j;
p=L;j=0;
while(p->next&&j{
p=p->next;++j;
} q=p->next;
p->next=q->next;
e=q->date;free(q);
cout<<"结点已经删除\n";
return 1;
}
//////////////////////////////////////////////////////////
main()
{int i=1,j;
link L=NULL;int a[7]={12,13,21,24,28,30,42 };
if(L)delete L;
L= (link)malloc(sizeof(LNode)) ;
if (!L) exit(1);
L->next=NULL;
cout<<"链表已经建立\n";
for(;i<=7;i++)
listinsert(L,i,a[i-1]) ;
show(L);
cout<<"--------------------\n";
while(1)
{ cout<<"输入1插入数据\n"<<"输入2删除最小节点\n"<<"输入3递减排序\n";
int yy;
cin>>yy;
switch(yy)
{
case 1:
cout<<"--------------------\n输入要插入的值\n";
cin>>j;
listinsert(L,i,j) ;
putline(L);
show(L);
cout<<"--------------------\n ";
break;
case 2: int e;
putline(L);
listdelete(L,1,e);
show(L);
cout<<"--------------------\n ";
break;
case 3: fputline(L);
show(L); break;
default: break;
}} }

回答(2):

(只是思路,语法不严格)
1.插入排序
int m,i,data=26,len=8;
for(i=0;i<=len-1;i++){
if(data>L[i])
break;
}
for(m=len;m>i+1;m--)
L[m]=L[m-1];
L[i+1]=data;
2.
p=head;
int i,min_data;
Node *near_p;
min_data=p->data;
for(i=1;i<=len;i++)
if(min_data>p->next->data){
min_data=p->next->data;
near_p=p;//near_p为最小值结点的前趋结点地址
}
//最后,near_p为最小值结点的前趋结点的地址
near_p->next=near_p->next->next;
delete near_p->next;
3.暂时只想出一种办法:
遍历链表,在遍历过程中,将每个结点的next值保存到一个指针数组中,然后再将每个结点的next值赋值为指针数组倒序的值,原第二结点next值为head,最后将head指向原最后一个结点,