线性表练习(21.10.6)

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表练习(21.10.6)相关的知识,希望对你有一定的参考价值。

1.设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

以下构建了无头结点的单链表:

#include<iostream>
#include<cstdio>
using namespace std;
typedef struct Node
{
    int data;
    Node *next;
}*Linklist,Node;
Linklist InitList(Linklist &p)//单链表初始化
{
    p=NULL;
    return p;
}
void HeadCreate(Linklist &p,int n)//从表尾到表头建立单链表
{
    p=InitList(p);//初始化
    Node *s;
    p=NULL;
    for(int i=0;i<n;i++)
    {
        s=new Node;
        cin>>s->data;
        s->next=p;
        p=s;
    }
}
void headcreate(Linklist &p,int n)//从表头到表尾建立单链表
{
    p=InitList(p);
    Node *s,*r;
    for(int i=0;i<n;i++)
    {
        s=new Node;
        cin>>s->data;
        s->next=NULL;
        if(p==NULL)
            p=r=s;
        else
        {
            r->next=s;
            r=s;
        }
    }
}
//以上两种创建方式中p记录了表头所在位置
void PrintList(Linklist p)
{
    Node *r=p;
    while(r!=NULL)
    {
        cout<<r->data<<" ";
        r=r->next;
    }
    cout<<endl;
}
void del_(Linklist &L,int x)
{
    Node *p;
    if(L==NULL)
        return;
    if(L->data==x)
    {
        p=L;
        L=L->next;
        delete p;
        del_(L,x);
    }
    else del_(L->next,x);
}
int main( )
{
    Linklist L,P;
    int n=8;
    L=InitList(L);
    cout<<"请输入8个数据:"<<endl;
    HeadCreate(L,n);
    PrintList(L);
    del_(L,5);
    PrintList(L);
    cout<<"请输入8个数据:"<<endl;
    headcreate(P,n);
    PrintList(P);
    del_(P,5);
    PrintList(P);
    return 0;
}

运行结果如下:

也不知道对不对,但运行结果正确。。。

2.构造有序(升序)的单链表,并实现单链表的逆置(可以采用结构化的程序设计方法实现,即不必定义类)

输入链表中的数据。(用0表示输入的结束,0不能添加到链表中),按顺序输出有序链表中的数据

#include<iostream>
using namespace std;
struct node
{
    int data;
    node *next;
};
int main()
{
    node *first,*p,*s,*r;
    int x;
    //建表
    first=new node;
    first->next=NULL;
    while(cin>>x&&x)
    {
        s=new node;
        s->data=x;
        r=first;
        p=first->next;
        while(p&&x>p->data)
        {
            r=p;
            p=p->next;
        }
        s->next=p;
        r->next=s;
    }
    //输出
    p=first->next;
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    //逆置
    p=first->next;
    s=NULL;
    while(p)
    {
        r=p->next;
        p->next=s;
        s=p;
        p=r;
    }
    //输出
    p=s;
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return 0;
}

运行结果如下:

3.

 

#include<iostream>
using namespace std;
int a[1000],b[1000];
struct node
{
    int data;
    node *next;
};
class linklist
{
public:
    linklist();
    linklist(int n,int b[]);//头插法
    linklist(int a[],int n);//尾插法
    void printlist();
    int del(int x);
    int delwz(int n);
    bool dzyx();//判断该链表是否递增有序
    ~linklist();
private:
    node *first;
};
linklist::linklist()
{
    first=new node;
    first->next=NULL;
}
linklist::linklist(int n,int b[])//头插法
{
    first=new node;
    first->next=NULL;
    node *s;
    for(int i=0; i<n; i++)
    {
        s=new node;
        s->data=b[i];
        s->next=first->next;
        first->next=s;
    }
}
linklist::linklist(int a[],int n)//尾插法
{
    first=new node;
    node *s=NULL,*p=first;
    for(int i=0; i<n; i++)
    {
        s=new node;
        s->data=a[i];
        p->next=s;
        p=s;
    }
    p->next=NULL;
}
void linklist::printlist()
{
    node *p;
    p=first->next;
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
int linklist::del(int x)
{
    node *p=first->next,*s=NULL,*q=first;
    if(p==NULL)
        return 0;
    while(p!=NULL)
    {
        if(p->data==x)
        {
            s=q->next;
            q->next=s->next;
            delete q;
        }
        q=p;
        p=p->next;
    }
    return 1;
}
int linklist::delwz(int n)
{
    if(n<1)
        return 0;
    node *p=first,*s=NULL;
    int c=0,x;
    while(p!=NULL&&c<n-1)
    {
        p=p->next;
        c++;
    }
    if(p==NULL||p->next==NULL)
        return 0;
    else
    {
        s=p->next;
        x=s->data;
        p->next=s->next;
        delete p;
        return x;
    }
    return 1;
}
bool linklist::dzyx()
{
    node *p=first->next,*s=NULL;
    int c=1;
    while(p)
    {
        s=p->next;
        if(s!=NULL&&(s->data)<(p->data))
        {
            c=0;
            break;
        }
        p=p->next;
    }
    if(c)
        return 1;
    else return 0;
}
linklist::~linklist()
{
    node *p=first;
    while(first)
    {
        first=first->next;
        delete p;
        p=first;
    }
}
int main()
{
    int n=0,x,m=0;
    while(cin>>x&&x!=0)
    {
        a[n++]=x;
    }
    while(cin>>x&&x!=0)
    {
        b[m++]=x;
    }
    linklist l1(a,n),l2(m,b);
    l1.printlist();
    l2.printlist();
    cin>>x;
    if(l1.del(x))
        l1.printlist();
    else cout<<"Error"<<endl;
    cin>>x;
    if(l2.delwz(x))
        l2.printlist();
    else cout<<"Error"<<endl;
    if(l1.dzyx())
        cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

不知道对不对。。。

以上是关于线性表练习(21.10.6)的主要内容,如果未能解决你的问题,请参考以下文章

Android 底部工作表布局边距

编程练习(用递归处理线性表的问题)

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

顺序表的实现以及力扣练习题

数据结构链表练习题

二级java练习