考点3 线性表的链式存储
二.综合应用题部分
1. 设h是无头结点的单链表。下列程序的功能是,如果线性表h的长度不小于2,则将首元结点删除并插入到表尾。请在空格处填上适当的语句,使算法完整。
typedef struct node
{
elementype data;
struct node *next;
} node, *linklist;
void change(linklist &h)
{
linklist p,q;
if ( h&&h->next) {
q=h;
h=________________;
p=h;
while(p->next)__________;
___________________;
___________________;
}
}
2. 函数实现单链表的删除算法,请在空格处将算法补充完整。
int ListDelete(LinkList L, int i, ElemType *s){
LNode*p,*q;
intj;
p=L;j=0;
while(( )&&(j<i-1))
{
p=p->next;j++;
}
if (p->next==NULL||j>i-1) returnERROR;
q=p->next;
;
*s=q->data;
free (q);
return OK;
}/*listDelete*/
3. 阅读下面程序:
LinkList mynote(LinkList L)
{//L是不带头结点的单链表的头指针
if(L&&L->next)
{
q=L;L=L->next;p=L;
S1: while(p->next) p=p->next;
S2: p->next=q;q->next=NULL;
}
return L;
}
请回答下列问题:
(1). 说明语句S1的功能;
(2). 说明语句组S2的功能;
(3). 设链表表示的线性表为(a1,a2, …,an),写出算法执行后的返回值所表示的线性表。
4. 下面程序段的功能是利用从尾部插入的方法建立单链表的算法,请在下划线处填上正确的内容。
typedef struct node {
int data;
struct node *next;
} lklist;
void lklistcreate(_____________ *&head )
{
for (i=1;i<=n;i++)
{
p=(lklist *)malloc(sizeof(lklist));
scanf(“%d”,&(p->data));
p->next=0;
if (i==1) head=q=p;
else {
q->next=p;
____________;
}
}
}
5. 设有一个带表头结点的双向链表L,其数据类型为DblList,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Locate(L, x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。函数中有些语句缺失,请将它们补上。
DblList Locate (DblList L, Type x) { //定位
|
while ( p != first &&__________) p = p->next;
if ( p != first ) { //链表中存在x
; //该结点的访问频度加1
current = p; //从链表中摘下这个结点
current->prior->next= current->next;
current->next->prior = current->prior;
p = current->prior; //寻找从新插入的位置
while ( p != first&& ____________)
p = p->prior;
current->next=____________; //插入在p之后
current->prior = p;
current->next->prior = current;
p->next =_________________;
}
else cout<<"Sorry. Not find!\n"; //没找到
}
6. 已知线性表采用链式存储结构,结点类型定义如下,试编写一个算法,在带头结点的单链表L中,删除所有值为x的结点。
typedefstruct LNode
{
Elemtype data;
Struct LNode *next;
}LNode,*Linklist;
更多资料,请访问我的个人主页:www.kaoyanlianmeng.com