第2章课后习题算法设计题(严蔚敏数据结构c语言版第2版)

2-6 设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点

#include<iostream>
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

int MAXList(LinkList L);
bool InitList(LinkList &L);
void CreateList(LinkList &L,int n);
void PrintList(LinkList L);

using namespace std;
int main(){
    LinkList L;
    InitList(L);
    int n;
    cout<<"请输入n的值:";
    cin>>n;
    CreateList(L,n);
    PrintList(L);
    cout<<"值最大的结点是"<<MAXList(L)<<endl;
    return 0;
}
/*值最大的结点:利用一个中间值max,
                初始值为第一个结点的数值,
                遍历单链表,如果max比值小则就让max等于该值,
                直到指针为空退出循环
*/
int MAXList(LinkList L){
    LinkList p;
    p=L->next;
    int max=p->data;
    while(p){
        if(max < p->data){
            max=p->data;
        }
         p=p->next;
    }
    return max;
}
//初始化单链表
bool InitList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    return true;
}
//建立单链表(后插法)
void CreateList(LinkList &L,int n){
    LinkList r,p;
    L=new LNode;
    L->next=NULL;
    r=L;
    cout<<"请输入单链表:";
    for(int i=0;i<n;i++){
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
//打印单链表
void PrintList(LinkList L){
    LinkList p;
    p=L->next;
    cout<<"单链表为:";
    while(p){
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

2-7 设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)

#include<iostream>
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList ReverseList(LinkList &L);
bool InitList(LinkList &L);
void CreateList(LinkList &L,int n);
void PrintList(LinkList L);

using namespace std;
int main(){
    LinkList L;
    InitList(L);
    int n;
    cout<<"请输入n的值:";
    cin>>n;
    CreateList(L,n);
    PrintList(L);
    cout<<"逆转后........"<<endl;
    LinkList reL;
    reL=ReverseList(L);
    PrintList(reL);
    return 0;
}
/*
逆转链接方向:(1)第一种方法:构造一个新结点,
把单链表依次取出链接在其后,5->4->3->2->1->头结点,
输出后发现少了5多了头结点,4->3->2->1->头结点。
目前还没解决!!!
(2)第二种方法:把单链表其余结点依次插入头结点和第一结点之间,
头结点->5->4->3->2->1,输出为5->4->3->2->1。
*/
LinkList ReverseList(LinkList &L){
/*    LinkList temp,p;
    p=NULL;
    while(L){
        temp=L->next;
        L->next=p;
        p=L;
        L=temp;
    }
     return p;
*/
    LinkList p,temp;
    p=L->next;
    L->next=NULL;
    while(p){
            temp=p->next;
            p->next=L->next;
            L->next=p;
            p=temp;
    }
    return L;
}
//初始化单链表
bool InitList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    return true;
}
//建立单链表(后插法)
void CreateList(LinkList &L,int n){
    LinkList r,p;
    L=new LNode;
    L->next=NULL;
    r=L;
    cout<<"请输入单链表:";
    for(int i=0;i<n;i++){
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
//打印单链表
void PrintList(LinkList L){
    LinkList p;
    p=L->next;
    cout<<"单链表为:";
    while(p){
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

2-10 已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素

#include<iostream>
#define MAXSIZE 100
typedef struct{
    int *elem;
    int length;
}Sqlist;
Sqlist DeleteList(Sqlist &L,int item);
void InitList(Sqlist &L);
void CreateList(Sqlist &L,int n);
void PrintList(Sqlist L);

using namespace std;
int main(){
    Sqlist L;
    Sqlist newL;
    int n;
    int item;
    InitList(L);
    InitList(newL);
    cout<<"请输入线性表的长度:";
    cin>>n;
    CreateList(L,n);
    PrintList(L);
    cout<<"请输入要删除的值:";
    cin>>item;
    newL=DeleteList(L,item);
    PrintList(newL);
    return 0;
}
/*删除值为item的元素:遍历找到与item不相等的元素位置,
将该位置的元素调到第一个位置,同时计数加一,
这样和item不相等的元素都保存在了线性表里,
而等于item的元素则没有存入线性表,
最后线性表的长度等于计数的值。
*/
Sqlist DeleteList(Sqlist &L,int item){
    int c=0;
    for(int i=0;i<L.length;i++){
        if(L.elem[i]!=item){
            L.elem[c]=L.elem[i];
            c++;
        }
    }
    L.length=c;
    return L;
}
//初始化线性表
void InitList(Sqlist &L){
    L.elem=new int[MAXSIZE];
    L.length=0;
}
//创建线性表
void CreateList(Sqlist &L,int n){
    cout<<"请输入数据:";
    for(int i=0;i<n;i++){
        cin>>L.elem[i];
        L.length++;
    }
}
//打印线性表
void PrintList(Sqlist L){
    cout<<"线性表为:";
    for(int i=0;i<L.length;i++){
        cout<<L.elem[i]<<" ";
    }
    cout<<endl;
}
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值