11.线性表之单链表的基本操作

来源:互联网 发布:网络重置命令 编辑:程序博客网 时间:2024/06/06 00:37

第一篇博文,本来不打算现在写的,下午准备过来教室自习,但是起来晚了,去了发现教室有人上课,我书还在里面,所以决定现在来写我今天也是开通博客以来的第一篇文章!

本人情况介绍:计算机科学与技术专业。现在大二! 从小立志学习计算机专业,现在在自己喜欢的专业里,任意翱翔~~~开通博客的目的一:是为了借助自己每天的学习,对一些知识点的学习能够在这里帮助到更多的人,如果有朋友通过我的博客能有所收获的话,那很好。二:通过这个平台也让自己每天能够静下心来总结一下自己当天学习到了什么,所以我基本上是每天晚上更新,当然今天情有点特殊,我会将自己当天的总结写下来,不管是知识的进步还是心得。三:我希望自己若干年后,工作后,甚至是退休后能够看看自己20岁开始每天的进步,不管我以后会去哪里,干什么工作,有什么样的成就,我希望能有个地方记录下这一切,非常不喜欢孤独的生活下去~~~

 

好,篇外话结束,今天带来的是线性表之单链表的基本操作:作为线性表的另外一种重要的存储结构,链式存储中的单链表存储形式是十分重要的,里面有很多优秀的算法,而且是往下学习的基础,所以特将单链表的基本操作函数以及完整的程序写在这里:

// 单链表.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
typedef char DataType ;
typedef struct Node
{
 DataType data;
 struct Node *next;
}Node,*LinkList;

void CreateListT(LinkList &L);//尾插法建表
void CreateListH(LinkList &L);//头插法建表
void Traverse(LinkList L);//遍历链表
Node *GetData(LinkList L,int i);//按序号查找,返回位置指针
Node *LocateNode(LinkList L,DataType key);//按值查找,返回位置指针
int ListLength(LinkList L);//长度
void InsertList(LinkList &L,int i,DataType x);//指定位置插入指定的值
void DeleteList(LinkList &L,int i,DataType &x);//删除指定位置的值
void MergeLinkList(LinkList &La,LinkList &Lb,LinkList &Lc);//合并两个有序单链表
void DestoryList(LinkList &L);//销毁链表
int EmpytList(LinkList &L);//判断是否为空表
void SortList(LinkList L);//链表排序

void CreateListH(LinkList &L)//头插法建表
{
 Node *s;//<=>LinkList s;
 char c;
 L=new Node;
 L->next=NULL;//申请头结点
 c=getchar();
 while(c!='$')
 {
  s=new Node;
  s->data=c;
  s->next=L->next;//<=>s->next=NULL;但是仅限于第一个节点,考虑到以后节点插入法相同,在头结点和第一个有效节点中间插入,用统一方法
  L->next=s;
  c=getchar();
 }

}

void CreateListT(LinkList &L)//尾插法建表
{
 Node *r,*s;
 char c;
 L=new Node;
 L->next=NULL;
 r=L;
 c=getchar();
 while(c!='$')
 {
  s=new Node;
  s->data=c;
  r->next=s;
  r=s;
  c=getchar();
 }
 r->next=NULL;
}

void Traverse(LinkList L)
{
 LinkList p=L->next;
 while(p!=NULL)
 {
  cout<<"->"<<p->data;
  p=p->next;
 }
}

Node *GetData(LinkList L,int i)
{
 int j;
 Node *p;
 if(i<=0) return NULL;
 p=L;j=0;
 while(p->next!=NULL&&j<i)
 {
  p=p->next;
  j++;
 }
 if(j==i) return p;
 else
  return NULL;
}

Node *LocateNode(LinkList L,DataType key)
{
 Node *p;
 p=L->next;
 while(p!=NULL&&p->data!=key)
  p=p->next;
 return p;
}

int ListLength(LinkList L)
{
 int len=1;
 Node *p;
 p=L->next;
 while(p->next!=NULL)
 {
 p=p->next;
 len++;
 }
 return len;
}

void InsertList(LinkList &L,int t,DataType x)
{
 Node *pre,*s;
 if(t-1==0)
  pre=L;
 else
 pre=GetData(L,t-1);//这里t-1是第t个节点前面那个节点,但是与getdata中下标只能为1-n冲突.
 if(pre==NULL)
  cout<<"插入的位置不合法!"<<endl;
 else
 {
  s=new Node;
  s->data=x;
     s->next=pre->next;
  pre->next=s;
 }
}

void DeleteList(LinkList &L,int i,DataType &x)
{
 Node *pre,*r;
 if(i-1==0)
  pre=L;
 else
 pre=GetData(L,i-1);//找前一个节点
 if(pre==NULL||pre->next==NULL)//删除的节点是最后节点的下一个节点,不合法!
  cout<<"删除的位置不合法!";
 else
 {
  r=pre->next;
  x=r->data;
  pre->next=r->next;
 }
 delete(r);           
}

void MergeLinkList(LinkList &La,LinkList &Lb,LinkList &Lc)
{
 Node *pa,*pb,*pc;
 pa=La->next ;
 pb=Lb->next;
 Lc=La;
 pc=Lc;
 while(pa!=NULL&&pb!=NULL)
 {
  if(pa->data<=pb->data)
  {
   pc->next=pa;pc=pa;pa=pa->next;
  }
  else
  {
   pc->next=pb;pc=pb;pb=pb->next;
  }
 }
 if(pa)
  pc->next=pa;
 else
  pc->next=pb;
 delete(Lb);
}

void DestoryList(LinkList &L)
{
 delete L;
 L->next=NULL;
}

int EmpytList(LinkList &L)
{
 if(L->next==NULL)
  return FALSE;
 else
  return TRUE;
}

void SortList(LinkList L)
{
 int i,j;
 LinkList p,q; DataType r;
 int len=ListLength(L);
 for(i=0,p=L->next;i<len-1;i++,p=p->next)
  for(j=i+1,q=p->next;j<len;j++,q=q->next)
   /*if(a[i]>a[j]
   {
    k=a[i];
    a[i]=a[j];
    a[j]=k;
   }*/
   if(p->data>q->data)
   {
   r=p->data;
   p->data=q->data;
   q->data=r;
   }
}

int main(int argc, char* argv[])
{
 int i,length,n;
 LinkList L,Lb,Lc;
 LinkList t;
 DataType key;
Menu:cout<<"\t单链表基本操作"<<endl;
 cout<<"\t1.CreateListT(L)(两种);\t2.SortList(L);"<<endl;
 cout<<"\t3.GetData(L,i);\t4.LocateNode(L,key);"<<endl;
 cout<<"\t5.ListLength(L);\t6.InsertList(L,i,key);"<<endl;
 cout<<"\t7.DeleteList(L,i,x);\t8.MergeLinkList(L,Lb,Lc);"<<endl;
 cout<<"\t9.EmpytList(L);\t10.DestoryList(L);"<<endl;
 cout<<"\t11.Traverse(L);"<<endl;
 cout<<"\t请选择:";
 cin>>n;
 switch(n)
 {
 case 1: cout<<"(执行建立链表函数以'$'结束,无空格):"<<endl;
   CreateListT(L);//发现问题:不能用CreatList做名字,会导致重载错误!
   system("cls");
   goto Menu;
   break;
 case 2:
   SortList(L);
   system("cls");
   goto Menu;
   break;
 case 3:
  cout<<"请输入要查找的序号:";
  cin>>i;
  t=GetData(L,i);
  if(t)
   cout<<"找到!该序号下数值是:"<<t->data;
  else
   cout<<"没找到!";
  system("cls");
  goto Menu;
  break;
 case 4:
  cout<<"请输入要查找的值:"<<endl;
  cin>>key;
  t=LocateNode(L,key);
  if(t)
   cout<<"找到!";
  else
   cout<<"没找到!";
  system("cls");
  goto Menu;
  break;
 case 5:
  length=ListLength(L);
  cout<<"该链表有"<<length<<"个节点";
  system("cls");
  goto Menu;
  break;
 case 6:
  cout<<"请输入指定值:";
  cin>>key;
  cout<<"请输入指定位置:";
  cin>>i;
  InsertList(L,i,key);
  system("cls");
  goto Menu;
  break;
 case 7:
  cout<<"请输入要删除节点的位置:";
  cin>>i;
  DeleteList(L,i,key);
  cout<<"删除节点位置的值为:"<<key;
  system("cls");
  goto Menu;
  break;
 case 8:
  cout<<"重新建立一个新链表(有序),以'$'结束:"<<endl;
  CreateListT(Lb);
  MergeLinkList(L,Lb,Lc);
  system("cls");
  goto Menu;
  break;
 case 9:
  if(EmpytList(L))
  cout<<"非空链表"<<endl;
  else
  cout<<"空链表"<<endl;
  system("pause");
  system("cls");
  goto Menu;
  break;
 case 10:
  DestoryList(L);
  cout<<"销毁成功!";
  system("cls");
  goto Menu;
  break;
 case 11:
  Traverse(L);
  system("cls");
  goto Menu;
  break;
 }
 return 0;
}

 

1 0
原创粉丝点击