线性表链式存储结构的特点是:用一组任意的储存单元存储线性表的数据元素(这组储存单元可以是连续的,也可以是不连续的)。
存储数据元素本身信息和指示其后继信息的数据元素,称为结点。它包含两个域:其中存储数据元素信息的域称为数据域;存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。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");
}