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

1.怎样在递增有序线性表L={12.13.21.24.28.30.42}中插入数据元素26的程序。
2.编写在带头节点的单链表中删除(一个)最小值结点的(高效)算法
3.设有一个带头点的单向链表L={12.13.21.24.28.30.42},数据项递增有序,写一个算法,重新排列链表,使数据递减有序.

忘那位高手指点一下以上3道题的思路,小弟感谢不尽!在线等
忘详细点!我是新手

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

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
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<i-1)
{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<<p->next->date<<endl;
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->date<q->date)
{ 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<i-1)
{
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;
}} }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-11-02
(只是思路,语法不严格)
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指向原最后一个结点,本回答被提问者采纳
相似回答