单链表的简单应用

来源:互联网 发布:一般网络女主播的收入 编辑:程序博客网 时间:2024/06/06 06:52
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType;


const int Maxsize=100;
struct LNode {
LNode* next;
ElemType data;
};
void InitList(LNode* &HL)//初始化
{   
HL=NULL;
}
void ClearList(LNode* &HL)//清空
{
HL=NULL;
}
int LenthList(LNode* HL)//得到单链表的长度
{
int i=0;
while(HL!=NULL)
{
i++;
HL=HL->next;
}
return i;
}
bool EmptyList(LNode* HL)//判断单链表是否为空
{
return HL==NULL;
}
ElemType GetList(LNode* HL,int pos)//找出给定序号pos的元素
{
if(pos<1)
{
cout << " pos is out range! " << endl;
exit(1);
}
int j=0;
while(HL!=NULL)
{
j++;
if(j==pos) break;
HL=HL->next;
}
if(HL!=NULL)
return HL->data;
else
{
cout << " pos is out range! " << endl;
exit(1);
}
}
void TraverseList(LNode* HL)//遍历单链表
{
while(HL!=NULL)
{
cout << HL->data << " ";
HL=HL->next;
}
cout << endl;
}
bool FindList(LNode* HL, ElemType& item)//找出给定值
{
while(HL!=NULL)
if(HL->data==item)
{
item = HL->data;
return true;
}
else HL=HL->next;
return false;
}
bool UpdateList(LNode* HL, const ElemType& item)//更新单链表的值
{
    while(HL!=NULL)
if(HL->data == item) break;
else HL=HL->next;
if(HL==NULL) return false;
else
{
HL->data=item;
return true;
}
}
bool InsertList(LNode* &HL, ElemType item, int pos)//按指定条件插入元素
{
if(pos<-1)
{
cout << "pos值无效!" << endl;
return false;
}
LNode* newptr;
newptr=new LNode;
newptr->data=item;


LNode* cp=HL;
LNode* ap=NULL;


 if(pos==0)
 {
while(cp!=NULL)
{
if(item<cp->data) break;
 else
 {
ap=cp;
cp=cp->next;
 }
}
 }
 else if(pos==-1) 
while(cp!=NULL)
{
ap=cp;
cp=cp->next;
}
 else
 {
int k=0;
while(cp!=NULL)
{
 k++;
 if(k==pos) break;
 else 
 {
ap=cp;
cp=cp->next;
 }
}
if(cp==NULL && k+1<pos)
{
cout << " pos值超出单链表长度加1! " << endl;
return false;
}
 }
     if(ap==NULL)
{
newptr->next=HL;
HL=newptr;
}
else
{
newptr->next=cp;
ap->next=newptr;
}
return true;
}
bool DeleteList(LNode* &HL, ElemType& item, int pos)//按指定条件删除元素
{
if(HL==NULL)
{
cout << "单链表为空,删除无效!" << endl;
return false;
}
if(pos<-1)
{
cout << "pos值无效!" << endl;
return false;
}
LNode* cp=HL;
LNode* ap=NULL;

if(pos==0) 
{
while(cp!=NULL)
{
if(item==cp->data) break;
else
{
ap=cp;
cp=cp->next;
}
}
if(cp==NULL)
{
cout << " 单链表中没有相应的节点可删除! " << endl;
}
}
 
else if(pos==-1) 
while(cp->next!=NULL) {ap=cp; cp=cp->next;}
else
{
int l=0;
while(cp!=NULL)
{
l++;
if(l==pos) break;
else
{
ap=cp;
cp=cp->next;
}
}
if(cp==NULL)
{
cout << " pos值无效! " << endl;
return false;
}
}
  if(ap==NULL)
 HL=HL->next;
  else 
 ap->next=cp->next;

    delete cp;
return true;
}
void SortList(LNode* &HL)//排序
{
LNode* SL;
InitList(SL);
LNode* r=HL;
while(r!=NULL)
{
LNode* t=r->next;
LNode* cp=SL;
LNode* ap=NULL;
while(cp=!NULL)
{
if(r->data < cp->data) break;
else
{
ap=cp;
cp=cp->next;
}
}
if(ap==NULL)
{
r->next=SL;
SL=r;
}
else
{
r->next=cp;
ap->next=r;
}
r=t;
}
HL=SL;
}


LNode *newlist(LNode* &HL,int x)//删除相同的元素  
{  
LNode *p,*t;  
 
while(HL)
{  
if(HL->data==x) {p=HL; HL=HL->next; free(p); p=NULL;} 
else break;  
}  
 
if(HL)  
{  
p=HL;  
while(p->next)  
{  
if(p->next->data==x) 
{
t=p->next; 
p->next=p->next->next; 
free(t); 
t=NULL;
}  
else 
p=p->next;  
}  
}  
  return HL;  

 
int main()
{
ElemType x1=56,x2=77,x3=5;
int a[100]={0};
LNode* t;
InitList(t);


for(int m=0; m<5; m++)
{
cin >> a[m];
InsertList(t, a[m],m+1);
}
cout << endl;


cout << "单链表为:" ;
TraverseList(t);


cout << endl;


cout << "单链表长度:" << LenthList(t) << endl;


cout << endl;


cout << "在表头插入元素值56!" << endl;
InsertList(t,56,1);
cout << "在表尾插入元素值77!" << endl;
InsertList(t,77,7);


cout << endl;
cout << "新的单链表为:" ;
TraverseList(t);


cout << endl;


cout << "下面将删除表头元素的值,得到的单链表为:" << endl;
DeleteList(t,x1,0); 
TraverseList(t);


cout << endl;


cout << "下面将删除表尾元素的值,得到的单链表为:" << endl;
DeleteList(t,x2,6);
TraverseList(t);


cout << endl;


cout << " 下面将删除单链表中为5的值,单链表变成:" << endl;

newlist(t,5);
//DeleteList(t,x3,0);
//DeleteList(t,x3,0);


TraverseList(t);


return 0;
}



0 0
原创粉丝点击