您的位置:首页 > 其它

线性表的基本操作(单链表)

2015-06-04 18:47 393 查看
要求同顺序表:

 

#include<iostream>

using namespace std;

#include <stdio.h>

#include <malloc.h>

#define MaxSize 50

typedef char ElemType;

typedef struct LNode //定义单链表结点类型

{

 ElemType data;

    struct LNode *next;

} LinkList;

void InitList(LinkList *&L)  //初始化线性表

{

 LinkList *s,*r;

 L=(LinkList *)malloc(sizeof(LinkList));  //创建头结点

 r=L;

 cout<<"请输入字符个数:";

 int x;

 cin>>x;

    ElemType c[MaxSize];

 for(int i=0;i<x;i++)

  cin>>c[i];

 for(int j=0;j<x;j++)

 {

  s=(LinkList *)malloc(sizeof(LinkList));

  s->data=c[j];

  r->next=s;

  r=s;

 }

 r->next=NULL;

}

void DestroyList(LinkList *&L) //销毁线性表

{

 L->next=NULL;

}

bool ListEmpty(LinkList *L) //判线性表是否为空表

{

 return(L->next==NULL);

}

int ListLength(LinkList *L) //求线性表的长度

{

 LinkList *p=L;int i=0;

 while (p->next!=NULL)

 {

  i++;

  p=p->next;

 }

 return(i);

}

void DispList(LinkList *L) //输出线性表

{

 LinkList *p=L->next;

 while (p!=NULL)

 {

  cout<<p->data<<" ";

  p=p->next;

 }

 printf("\n");

}

ElemType GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值

{

 int j=0;

 LinkList *p=L;   //p指向头节点,j置为0(即头节点的序号为0)

 while (j<i && p!=NULL) //找第i个节点

 { j++;

 p=p->next;

 }

 if (p==NULL)   //不存在第i个数据节点,返回0

  return 0;

 else     //存在第i个数据节点,返回1

 {

  e=p->data;

  return e;

 }

}

int LocateElem(LinkList *L,ElemType e) //按元素值查找

{

 int i=1;

 LinkList *p=L->next;  //p指向开始节点,i置为1(即开始节点的序号为1)

 while (p!=NULL && p->data!=e) //查找data值为e的节点,其序号为i

 {

  p=p->next;

  i++;

 }

 if (p==NULL)    //不存在元素值为e的节点,返回0

  return(0);

 else      //存在元素值为e的节点,返回其逻辑序号i

  return(i);

}

bool ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素

{

 int j=0;

 LinkList *p=L,*s;   //p指向头节点,j置为0(即头节点的序号为0)

 while (j<i-1 && p!=NULL) //查找第i-1个节点

 {

  j++;

  p=p->next;

 }

 if (p==NULL)   //未找到第i-1个节点,返回false

  return false;

 else     //找到第i-1个节点*p,插入新节点并返回1

 {

  s=(LinkList *)malloc(sizeof(LinkList));

  s->data=e;   //创建新节点*s,其data域置为e

  s->next=p->next; //将*s插入到*p之后

  p->next=s;

  return true;

 }

}

bool ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素

{

 int j=0;

 LinkList *p=L,*q;   //p指向头节点,j置为0(即头节点的序号为0)

 while (j<i-1 && p!=NULL) //查找第i-1个节点

 {

  j++;

  p=p->next;

 }

 if (p==NULL)    //未找到第i-1个节点,返回false

  return false;

 else      //找到第i-1个节点*p

 {

  q=p->next;    //q指向第i个节点

  if (q==NULL)   //若不存在第i个节点,返回false

   return false;

  e=q->data;

  p->next=q->next;  //从单链表中删除*q节点

  free(q);    //释放*q节点

  return true;   //返回true表示成功删除第i个节点

 }

}

void s()

{

    printf("1.初始化\n");

 printf("2.清空\n");

 printf("3.求链表长度\n");

 printf("4.检查链表是否为空\n");

 printf("5.检查链表是否为满\n");

 printf("6.遍历链表\n");

 printf("7.从链表中查找元素\n");

 printf("8.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");

 printf("9.向链表中插入元素\n");

 printf("10. 从链表中删除元素\n");

 printf("其他键退出。。。。。\n");

}

int scan()

{

 int d;

    cout<<"请选择所要进行的操作:\n";

 scanf("%d",&d);

 return(d);

}

int main()

{

 int quit=0;

 int i;

    s();

 ElemType e;

 LinkList *L;

        printf("--第一次操作需选择初始化--\n");

 while(!quit)

  switch(scan())

 {

case 1:InitList(L);break;

case 2:DestroyList(L);break;

case 3:cout<<"链表长度为:"<<ListLength(L)<<endl;break;

case 4:if(ListEmpty(L))

     cout<<"链表为空"<<endl;

 else

  cout<<"链表不为空"<<endl;

 break;

case 5:if(ListLength(L)==MaxSize)cout<<"链表已满";

 else

  cout<<"链表未满";

 break;

case 6:DispList(L);break;

case 7:cout<<"请输入需要查找第几个元素:";

 cin>>i;

 cout<<"第"<<i<<"个元素的值为"<<GetElem(L,i,e)<<endl;

 break;

case 8:cout<<"请输入需要查找的元素:";

 ElemType e2;

 cin>>e2;

 if(LocateElem(L,e2)==0)

  cout<<"链表中不含有元素"<<e2<<endl;

 else

  cout<<e2<<" 为第 "<<LocateElem(L,e2)<<" 个元素"<<endl;

 break;

case 9:printf("请输入要插入的元素的位置和其值:\n");

 int i0;

 ElemType e0;

 cin>>i0>>e0;

 ListInsert(L,i0,e0);

 break;

case 10:printf("请输入要删除的元素的位置:\n");

 int i1;

 cin>>i1;

 ElemType e1;

 ListDelete(L,i1,e1);

 break;

default:quit=1;

 }

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: