线性表练习(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)的主要内容,如果未能解决你的问题,请参考以下文章