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;
}