SHAOXIAOJ正在加载中...

1641: 线性表-基本操作(链式存储,不建议学生做)

金币值:2 定数:11 时间限制:1.000 s 内存限制:128 M
正确:2 提交:5 正确率:40.00% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 数据结构-线性表

题目描述

请补全以下代码:

#include <stdio.h>   
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0 
typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ 
 
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node,*linkList;

Status visit(ElemType c)
{
    printf("%d ",c);
    return OK;
}
 
Status InitList(linkList &L);
Status ListEmpty(linkList L);
Status ClearList(linkList &L);
int ListLength(linkList L);
Status GetElem(linkList L,int i,ElemType *e);
int LocateElem(linkList L,ElemType e);
Status ListInsert(linkList &L,int i,ElemType e);
Status ListDelete(linkList &L,int i,ElemType *e);
Status ListTraverse(linkList L);

int main()
{        
    linkList L;
    ElemType e,t;
    Status i;
    int j,k,n;    
    i=InitList(L);
    printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
    scanf("%d",&n);
    for(j=1;j<=n;j++){
        scanf("%d",&t);
        if(ListInsert(L,1,t)!=OK) exit(0);
    }
    printf("在L的表头依次插入元素后:L.data=");
    ListTraverse(L); 
    printf("ListLength(L)=%d\n",ListLength(L));
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否)\n",i); 
    i=ClearList(L);
    printf("清空L后:ListLength(L)=%d\n",ListLength(L));
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否)\n",i);
    scanf("%d",&n);
    for(j=1;j<=n;j++){
        scanf("%d",&t);
        if(ListInsert(L,j,t)!=OK) exit(0);
    }
    printf("在L的表尾依次插入元素后:L.data=");
    ListTraverse(L); 
    printf("ListLength(L)=%d\n",ListLength(L)); 
    ListInsert(L,1,0);
    printf("在L的表头插入0后:L.data=");
    ListTraverse(L); 
    printf("ListLength(L)=%d\n",ListLength(L)); 
    GetElem(L,5,&e);
    printf("第5个元素的值为%d\n",e);
    for(j=1;j<=2;j++)
    {
        scanf("%d",&t);
        k=LocateElem(L,t);
        if(k)
            printf("第%d个元素的值为%d\n",k,t);
        else
            printf("没有值为%d的元素\n",t);
    }
    k=ListLength(L); /* k为表长 */
    for(j=k+1;j>=k;j--)
    {
        i=ListDelete(L,j,&e); /* 删除第j个数据 */
        if(i==ERROR)
            printf("删除第%d个数据失败\n",j);
        else
            printf("删除第%d个的元素值为:%d\n",j,e);
    }
    printf("依次输出L的元素:");
    ListTraverse(L); 
    j=5;
    ListDelete(L,j,&e); /* 删除第5个数据 */
    printf("删除第%d个的元素值为:%d\n",j,e);
    printf("依次输出L的元素:");
    ListTraverse(L); 
    i=ClearList(L);
    printf("清空L后:ListLength(L)=%d\n",ListLength(L));
    return 0;
}

/* 仅提交以下代码 */
/* 初始化线性表 */
Status InitList(linkList &L)
{
    _________________/* 产生头结点,并使L指向此头结点 */
   ___________________ /* 存储分配失败 */
            return ERROR;
   ___________________           /* 指针域为空 */
 
    return OK;
}
 
/* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(linkList L)
{
    if(L->next)
            return FALSE;
    else
            return TRUE;
}
 
/* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(linkList &L)
{
         linkList p,q;
         p=L->next;           /* p指向第一个结点 */
         while(p)                /* 没到表尾 */
         {
                  q=p->next;
                  free(p);
                  p=q;
         }
          L->next=NULL;                   /* 头结点指针域为空 */
         return OK;
}
 
/* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(linkList L)
{
    int i=0;
    ____________            /* p指向第一个结点 */
    while(p)                        
    {
    __________        
    }
    return i;
}
 
/* 初始条件:线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(linkList L,int i,ElemType *e)
{
         int j;
         linkList p;                 /* 声明一结点指针p */
         __________;                     /* 让p指向链表L的第一个结点 */
         j = 1;                  /* j为计数器 */
         while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */
         {   
            ___________           
         }
         if ( !p || j>i ) 
                  return ERROR; /* 第i个元素不存在 */
         ___________;                 /* 通过e取此元素的数据 */
         return OK;
}
 
/* 初始条件:线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(linkList L,ElemType e)
{
    int i=0;
    linkList p=L->next;
    while(p)
    {
    _______________
    }
 
    return 0;
}
 
 
/* 初始条件:线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(linkList &L,int i,ElemType e)
{
         int j;
         linkList p,s;
         p = L;   
         j = 1;
         while (_____)     /* 寻找第i个结点 */
         {
                  p = p->next;
                  ++j;
         } 
         if (!p || j > i) 
                  return ERROR;   /* 第i个元素不存在 */
         s = (linkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */
         s->data = e; 
         __________;                /* 将p的后继结点赋值给s的后继 */
         __________;                     /* 将s赋值给p的后继 */
         return OK;
}
 
/* 初始条件:线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(linkList &L,int i,ElemType *e)
{
         int j;
         linkList p,q;
         p = L;
         j = 1;
         while (p->next && j < i) /* 遍历寻找第i个元素 */
         {
        p = p->next;
        ++j;
         }
         if (!(p->next) || j > i) 
             return ERROR;           /* 第i个元素不存在 */
         _____________;
         _____________;                              /* 将q的后继赋值给p的后继 */
         _____________;                          /* 将q结点中的数据给e */
         free(q);                               /* 让系统回收此结点,释放内存 */
         return OK;
}
 
/* 初始条件:线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(linkList L)
{
    linkList p=L->next;
    while(______)
    {
        visit(p->data);
        _________;           
    }
    printf("\n");
    return OK;
}

输入格式

共有5行:
第1行:进行头插法元素个数n
第2行:n个数据
第3行:进行尾插法元素个数n
第4行:n个数据
第5行:两个待查找的数据

输入样例    复制

5
1 2 3 4 5
10
1 2 3 4 5 6 7 8 9 10
3 4

输出样例    复制

初始化L后:ListLength(L)=0
在L的表头依次插入元素后:L.data=5 4 3 2 1
ListLength(L)=5
L是否空:i=0(1:是 0:否)
清空L后:ListLength(L)=0
L是否空:i=1(1:是 0:否)
在L的表尾依次插入元素后:L.data=1 2 3 4 5 6 7 8 9 10
ListLength(L)=10
在L的表头插入0后:L.data=0 1 2 3 4 5 6 7 8 9 10
ListLength(L)=11
第5个元素的值为4
第4个元素的值为3
第5个元素的值为4
删除第12个数据失败
删除第11个的元素值为:10
依次输出L的元素:0 1 2 3 4 5 6 7 8 9
删除第5个的元素值为:4
依次输出L的元素:0 1 2 3 5 6 7 8 9
清空L后:ListLength(L)=0