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

来源:互联网 发布:php用什么软件编程 编辑:程序博客网 时间:2024/05/18 05:14

要求同顺序表:

 

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

0 0