数据结构作业

线性表链式存储结构的特点是:用一组任意的储存单元存储线性表的数据元素(这组储存单元可以是连续的,也可以是不连续的)。

存储数据元素本身信息和指示其后继信息的数据元素,称为结点。它包含两个域:其中存储数据元素信息的域称为数据域;存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。N个结点链结成一个链表,即为线性表。

单链表的创建:初始化创建空表,生成新结点作为头结点,头指针指向头结点,头结点的指针域置空。

单链表的插入:这里使用前插建立单链表,每一次新插入的元素的指针域指向原来的第一个元素,头结点的指针域指向新插入的元素。

单链表的删除:通过一个临时指针遍历找到要删除的元素,另一个跟踪指针跟踪到要删除元素的前一个元素。找到要删除元素时,跟踪指针的指针域指向要删除元素的后一个元素,删除临时指针。

单链表的遍历:用一个临时指针进行遍历,每遍历一个元素,输出其本身元素的信息。并输出链表长度。

栈是限定仅在表尾进行插入或删除操作的线性表。栈的表尾端称为栈顶,栈的表头端称为栈底。不含元素的空表称为空栈。

栈的创建:先创建一个空栈,栈顶指针和栈底指针同指向一个新建的结点。

入栈:插入结点的指针域指向原来的栈顶,修改栈顶指针为指向新插入结点指针P,(栈顶指针始终指向一个代填入的位置),将栈顶元素置数据。(栈顶元素为栈顶指针所指结点的指针域所指向的元素。)

出栈:用一个临时指针指向栈顶元素,栈顶指针所指结点的的指针域指向栈顶元素的下一个元素。删除临时指针,输出原栈顶元素的数据。

遍历:从栈顶开始,用一个临时指针进行遍历,每遍历一个元素,输出其本身元素的信息。并输出栈长度。

队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端进行删除元素。在队列中,允许插入的一端称为队尾,允许删除的一端称为队头。

队列的创建:创建一个空队,队头指针和队尾指针指向同一个新建的结点。

入队:待插入结点置数据,队尾指针域指向插入结点,修改队尾指针为P

出队:临时指针指向队头后的第一个元素,队头结点的指针域指向队头后的第二个元素,删除临时指针,输出数据。

遍历:从队头开始,用一个临时指针进行遍历,每遍历一个元素,输出其本身元素的信息。并输出队列长度。



 

#include <iostream>

#include <stdio.h>

using namespace std;

 

typedef struct DataType      //结点结构

{

    int data;

    DataType *next;

} *LinkList;

 

LinkList L;   
//以L为头指针

 

typedef struct lStack        //栈结构

{

    DataType *top, *base;

};

 

typedef struct lQueue        //队结构

{

    DataType *front, *rear;

};

 

typedef struct lList           //广义表

{

    lStack LinkStack;

    lQueue LinkQueue;

} TypeLinearList;

 

TypeLinearList LinearList;

 

void Create(char ch)                                                     
//创建

{

 

    if (ch == 'S')

    {

         cout << "开始创建栈。";

         LinearList.LinkStack.base = new DataType;

         if (!LinearList.LinkStack.base)

         {

             cout << "error!";

         }

         else

         {

             LinearList.LinkStack.top =
LinearList.LinkStack.base;

             LinearList.LinkStack.base->next
= NULL;

         }

    }

    else if (ch == 'Q')

    {

         cout << "开始创建队列。";

         LinearList.LinkQueue.front = new DataType;

         if (!LinearList.LinkQueue.front)

        {

             cout << "error!";

         }

         else

         {

             LinearList.LinkQueue.rear =
LinearList.LinkQueue.front;

         }

    }

    else if (ch == 'L')

    {

         cout << "开始创建单链表。";

         L = new DataType;

         if (!L)

         {

             cout << "error!";

         }

         else 

         L->next = NULL;

    }

 

}

 

void Intsert(char ch)                                                    
//插入

{

    int d;

    DataType*p = new DataType;

    if (!p)

    {

         cout << "error!";

    }

    else

    {

         if (ch == 'S')

         {

             cout << "输入要入栈的元素:";

 

             cin >> d;

             p->next =
LinearList.LinkStack.top;

             LinearList.LinkStack.top = p;

             p->next->data = d;

 

         }

         else if (ch == 'Q')

         {

             cout << "输入要入队的元素:";

 

             cin >> d;

             p->data = d;

             p->next = NULL;

             LinearList.LinkQueue.rear->next
= p;

             LinearList.LinkQueue.rear = p;

 

         }

         else if (ch == 'L')                          //前插

         {

             cout << "输入要插入链表的元素:";

             cin >> d;

             p->data = d;

             p->next = L->next;

             L->next = p;

 

         }

 

    }

}

 

void Dele(char ch)                                         //删除

{

    DataType*q;

    int e;

    if (ch == 'S')

    {

         if (LinearList.LinkStack.top == NULL)

         {

             cout << "栈为空!";

         }

         else

         {

             cout << "出栈" << endl;

             q =
LinearList.LinkStack.top->next;

             e = q->data;

             LinearList.LinkStack.top->next =
q->next;

             delete q;

             cout << "删除元素为" << e << endl;

         }

 

    }

    else if (ch == 'Q')

    {

         if (LinearList.LinkQueue.front == NULL)

         {

             cout << "队为空!";

         }

         else

         {

             cout << "出队" << endl;

             q =
LinearList.LinkQueue.front->next;

             e = q->data;

             LinearList.LinkQueue.front->next
= q->next;

             if (LinearList.LinkQueue.rear->next ==
q)LinearList.LinkQueue.rear->next = LinearList.LinkQueue.front->next;

             delete q;

             cout << "删除元素为" << e << endl;

         }

    }

    else if (ch == 'L')

    {

         DataType*t;

         cout << "输入你要删除的链表元素:" << endl;

         cin >> e;

         t = L;

         q = L->next;

         while (q)

         {

            if (q->data ==
e)

             {

                  cout << "找到要删除元素" << endl;

                  t->next = q->next;

                  q = NULL;

             }

             else

             {

             t
= t->next;

                
q = q->next;

                  if (q == NULL) { cout << "未找到要删除的元素!" << endl; }

             }

         }

         delete q;

    }

 

}

 

void RLength(char ch)                                                       
//遍历和获取长度

{

    DataType*q;

    int num = 0;

    cout << "遍历并输出元素数目" << endl;

    if (ch == 'S')

    {

         if (LinearList.LinkStack.top == NULL)

         {

             cout << "栈为空!";

         }

         else

         {

             q = LinearList.LinkStack.top->next;

             while (q)

             {

                  

                  cout << q->data << ' ';

                  num++;

                  q = q->next;

             }

             cout << "栈长为:" << num << endl;

         }

 

    }

    else if (ch == 'Q')

    {

         if (LinearList.LinkQueue.front == NULL)

         {

             cout << "队为空!";

         }

         else

         {

             q = LinearList.LinkQueue.front->next;

             while (q)

             {

                  cout << q->data << ' ';

                  num++;

                  q = q->next;

             }

             cout << "队长为:" << num << endl;

         }

    }

    else if (ch == 'L')

    {

         q = L->next;

         if (L == NULL)

         {

             cout << "链表为空!";

         }

         else

         {

          while (q)

          
{

             cout << q->data << ' ';

             num++;

             q = q->next;

           
}

         cout << "链长为:" << num << endl;

         }

         

    }

 

}

 

 

int main()

{

    static char ch;

    int count;

    int temp1 = 1;

    int temp2 = 1;

    int choice;

    while (temp1 == 1)

    {

         cout << "对栈操作,请按‘S’;对队列操作,请按‘Q’;对单链表操作,请按‘L’。" << endl;

         cin >> ch;

         while (ch != 'S'&&ch != 'Q'&&ch!='L')

         {

             cout << "输入字符不符合要求,请重新输入";

             cin >> ch;

         }

         Create(ch);

         while (temp2 == 1)

         {

         cout << "插入请按“1”,删除请按“2”,遍历并输出长度请按“3”,结束操作请按其他键。" << endl;

         cin >> choice;

         switch (choice)

         {

         case 1:

         {

             cout << "输入要插入的元素数目:";

         cin >> count;

         for (int i = 0; i < count; i++)
Intsert(ch);

         }break;

         case 2:Dele(ch); break;

         case 3:RLength(ch); break;

         default:temp2 = 0; break;

         }

 

         }

         

         cout << "是否要选择栈或者队或者单链表进行操作,是 请按‘1’,否 请按‘0’" << endl;

         cin >> temp1;

         if (temp1 == 1) { temp2 = 1; }

    }

    system("Pause");

}


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值