风花雪月 发表于 2006-8-30 08:06

单链表常用运算问题(基于VC)

针对单链表的常用运算:创建、查找、删除、插入、浏览、求链表的长度。两个version主要是针对查找、删除中存在的两种情况,即满足条件的所有结点的运算和程序控制语句中满足条件的第一个结点的运算。
(一) 满足所有条件的所有结点的运算
#include "iostream.h"
typedef struct node
{ int data;
struct node *next;
}List;
List *Create();                      //创建链表
int Len(List *h);                  //链表的长度
void Locate(List *h,int x);            //查找所有数据域为x的结点
void Insert(List *h,int n,int x);         //在第n位插入结点x
void Del(List *h,int x);               //删除所有数据域为x的结点
void Browse(List *h);                //浏览链表

void main()
{   List *head;
int Length,z,n;
head=Create();
Length=Len(head);
cout<<"链表的长度为:"<<Length<<"\n";
cout<<"请输入您要插入的位置:";
cin>>n;
cout<<"请输入您要插入的数:";
cin>>z;
Insert(head,n,z);
Browse(head);
cout<<"请输入您要查找的数:";
cin>>z;
Locate(head,z);
Browse(head);
cout<<"请输入您要删除的数:";
cin>>z;
Del(head,z);
Browse(head);
}

List *Create()
{ List *h,*s,*r;
int x,tag;
cout<<"请输入结束标志:";
cin>>tag;
    h=new List;
h->data=NULL;
r=h;
cout<<"请输入数据:";
cin>>x;
while(x!=tag)
{
s=new List;
s->data=x;
      r->next=s;
r=s;
cout<<"请输入数据:";
cin>>x;
}
r->next=NULL;
return h;
}

int Len(List *h)
{ List *s;
int l=0;
    s=h;
while(s->next!=NULL)
{
s=s->next;
l++;
}
return l;
}

void Locate(List *h,int x)             //查找所有结点x,并找出它们所在的位置
{    List *p;
   int n=-1,flag=0;                  //由于"p=h",故"n=-1"
   p=h;                                                            
   for(;p!=NULL;p=p->next)   
   {
    n++;
    if(p->data==x)
    {
   cout<<"在第"<<n<<"个位置有结点"<<x<<"\n";
         flag=1;                     //说明链表中有结点x
    }
   }
   if(flag==0)
    cout<<"链表中不存在结点"<<x<<"\n";
}

void Insert(List *h,int n,int x)
{ List *s,*p;
int m=0;
s=new List;
if(s==NULL)                     //如果没有空间分配给p,说明链表已满
cout<<"链表已满。\n";
else
{   
p=h;
while(p->next!=NULL&&m!=n)
{
   p=p->next;
   m++;
}
if(p->next==NULL)
   cout<<"插入不合法!\n";
else
{
   s->data=x;
   s->next=p->next;
   p->next=s;
}
    }
}

void Del(List *h,int x)                  //删除所有结点x
{   List *q;
int flag=0;
while(h->next)
{
   if(h->next->data==x)
   {
    flag=1;                  //说明链表中有结点x
    q=h->next;
    h->next=q->next;
    delete q;
   }
   else
    h=h->next;
}
if(flag==0)
         cout<<"链表中不存在结点"<<x<<"\n";
}

void Browse(List *h)
{ List *q;
q=h->next;
while(q!=NULL)
{
      cout<<"数据域为:"<<q->data<<"\n";
q=q->next;
}
}

(二)程序控制语句中满足条件的第一个结点的运算。
#include "iostream.h"
typedef struct node
{ int data;
struct node *next;
}List;
List *Create();                           //创建链表
int Len(List *h);                         /链表的长度
void Locate(List *h,int x);               //查找数据域为x的结点
void Insert(List *h,int n,int x);            //在第n位插入结点x
void Del(List *h,int x);                  //删除数据域为x的结点
void Browse(List *h);                     //浏览链表

void main()
{   List *head;
int Length,z,n;
head=Create();
Length=Len(head);
cout<<"链表的长度为:"<<Length<<"\n";
cout<<"请输入您要插入的位置:";
cin>>n;
cout<<"请输入您要插入的数:";
cin>>z;
Insert(head,n,z);
Browse(head);
cout<<"请输入您要查找的数:";
cin>>z;
Locate(head,z);
Browse(head);
cout<<"请输入您要删除的数:";
cin>>z;
Del(head,z);
Browse(head);
}

List *Create()
{ List *h,*s,*r;
int x,tag;
cout<<"请输入结束标志:";
cin>>tag;
    h=new List;
h->data=NULL;
r=h;
cout<<"请输入数据:";
cin>>x;
while(x!=tag)
{
s=new List;
s->data=x;
      r->next=s;
r=s;
cout<<"请输入数据:";
cin>>x;
}
r->next=NULL;
return h;
}

int Len(List *h)
{ List *s;
int l=0;
    s=h;
while(s->next!=NULL)
{
s=s->next;
l++;
}
return l;
}

void Locate(List *h,int x)         
{    List *p;
   int n=-1,flag=0;                            //由于"p=h",故"n=-1"
   p=h;                                                            
   for(;p!=NULL;p=p->next)
   {
    n++;
       if(p->data==x)
       {
   cout<<"在第"<<n<<"个位置有结点"<<x<<"\n";
   flag=1;
    }
   }
   if(flag==0)
    cout<<"链表中没有结点"<<x<<"\n";
}

void Insert(List *h,int n,int x)
{ List *s,*p;
int m=0;
s=new List;
if(s==NULL)                            //如果没有空间分配给p,说明链表已满
cout<<"链表已满。\n";
else
{   
p=h;
while(p->next!=NULL&&m!=n)
{
   p=p->next;
   m++;
}
if(p->next==NULL)
   cout<<"插入不合法!\n";
else
{
   s->data=x;
   s->next=p->next;
   p->next=s;
}
    }
}

void Del(List *h,int x)               
{   List *p,*q;
int flag=0;
q=h;                                 
while(q->next!=NULL&&q->data!=x)      
{   
p=q;
   q=q->next;
}
if(x==q->data)
{
p->next=q->next;
   delete q;
cout<<"删除完成!\n";
}
else
cout<<"链表中没有结点"<<x<<"\n";
}

void Browse(List *h)
{ List *q;
q=h->next;
while(q!=NULL)
{
      cout<<"数据域为:"<<q->data<<"\n";
q=q->next;
}
}
页: [1]
查看完整版本: 单链表常用运算问题(基于VC)