一、前言
欢迎大家进入本学期数据结构的学习,这篇文章分享的是数据结构的日常练习题的答案,答案仅供参考。希望大家在本学期能够学会、学好数据结构,并希望大家能够重视起这门课程,我只能说这门课程对以后的code精进、计算机相关比赛很有帮助。当然想考研的同学,必须要学好这门课程!最后祝大家:欢愉且胜意,万事皆可期。
二、快捷查找方法
手机端通过 目录查找
电脑端通过 1. ctrl + f 输入名字查找
2. 目录查找
当然,大家也可以保存本篇文章的地址,方便以后查询老师留的其他题的答案。
三、正文
章节 02
1. 用类实现顺序线性表
#include <iostream>
using namespace std;
#include<iostream>
#include<fstream>
#include<string>
#include <iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
class Sqlist {
protected:
int length;
ElemType *elem;
public:
Sqlist() {
length = 0;
elem = new ElemType[MAXSIZE];
}
void show() {
for (int i = 1; i <= length; i++) {
cout << i << ":" << elem[i-1] << endl;
}
}
Status insert(ElemType s) {
if (length >= MAXSIZE) return ERROR;
elem[length] = s;
length++;
return OK;
}
Status deleteLoc(int loc) {
if (loc < 1 || loc > length) return ERROR;
for (int i = loc; i < length; i++) {
elem[i-1] = elem[i];
}
length--;
return OK;
}
};
int main()
{
//线性表的的初始化、插入、取值
Sqlist Lscore; //创建Sqlist对象并初始化,用来存储学生《数据结构》成绩(最多100人)
for(int i=1; i<=3; i++) //输入3个学生成绩,依次添加到线性表中
{
int s;
cin>>s;
Lscore.insert(s);
}
Lscore.show(); //遍历线性表
int loc;
cin>>loc; //输入要删除的位置
if(Lscore.deleteLoc(loc)==OK) cout<<"delete success!"<<endl;
else cout<<"Error!"<<endl;
Lscore.show();
return 0;
}
2. 后插法创建单链表
#include <stdio.h>
#include <stdlib.h>
typedef int E;
typedef struct LNode {
char data[5];
struct LNode *next;
} LNode, *LinkList;
void InitList(LinkList &head) {
head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
}
void showList(LinkList Lname) {
if (Lname->next == NULL) printf("empty!\n");
int i = 1;
LNode *node = Lname->next;
while (node != NULL) {
printf("%d:%s\n", i, node->data);
node = node->next;
i++;
}
}
void CreateList_R(LinkList Lname, E element) {
LNode *L = Lname;
for (int i = 0; i < element; i++) {
LNode *node = (LNode *)malloc(sizeof(LNode));
scanf("%s", node->data);
node->next = NULL;
L->next = node;
L = node;
}
}
int main()
{
LinkList Lname;
InitList(Lname); //初始化单链表
showList(Lname); //单链表遍历
CreateList_R(Lname,5); //后插法创建单链表
showList(Lname); //单链表遍历
return 0;
}
3. 双向链表的删除
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int E;
typedef struct DuLNode {
E element;
struct DuLNode *prev;
struct DuLNode *next;
} DuLNode, *DuLinkList;
E InitDuLNode(DuLinkList &head) {
head = new DuLNode;
if (head == NULL) return ERROR;
head->prev = head->next = NULL;
return OK;
}
E CreateDuL_H(DuLinkList &head, E element) {
head->next = NULL;
for (int i = 0; i < element; i++) {
DuLinkList node = new DuLNode;
if (node == NULL) return ERROR;
cin >> node->element;
node->next = head->next;
if (head->next != NULL) {
head->next->prev = node;
}
node->prev = head;
head->next = node;
}
return OK;
}
void show(DuLinkList head) {
DuLinkList node = head->next;
for(int i = 1; node != NULL; i++) {
cout<<i<<":"<<node->element<<endl;
node = node->next;
}
}
E ListDelete_DuL(DuLinkList head, int index) {
int j = 0;
DuLinkList node = head;
while (node && j < index - 1) {
node = node->next;
j++;
}
if (!node || j > index - 1) return ERROR;
DuLinkList poi = node->next;
if (!poi) return ERROR;
node->next = poi->next;
if (poi->next) poi->next->prev = node;
delete poi;
return OK;
}
int main()
{
DuLinkList L;
InitDuLNode(L); //初始化双向链表
CreateDuL_H(L,4); //前插法创建双向链表
show(L); //遍历双向链表
int i;
cout<<"Please input the location you want to delete:"<<endl;
cin>>i;
if(ListDelete_DuL(L,i)==OK)
cout<<"Delete success!"<<endl;
else
cout<<"Delete Error!"<<endl;
show(L);
return 0;
}
4. 递增链表合并(不重复)
#include <iostream>
using namespace std;
typedef int E;
typedef struct Node {
E element;
struct Node* next;
} Node, *LinkList;
void InitList(LinkList &head) {
head = new Node;
head->next = NULL;
}
void CreateList_Up(LinkList head, E element) {
LinkList p, q;
for (int i = 0; i < element; i++) {
p = new Node;
cin>>p->element;
p->next = NULL;
q = head;
while (q->next && q->next->element < p->element) {
q = q->next;
}
if (!q->next || q->next->element > p->element) {
p->next = q->next;
q->next = p;
}
else {
delete p;
}
}
}
void showList(LinkList head) {
Node* node = head->next;
for(int i = 1; node !=NULL; i++) {
cout<<i<<":"<<node->element<<endl;
node = node->next;
}
}
void MergeList(LinkList La, LinkList Lb, LinkList Lc) {
Node* pa = La->next;
Node* pb = Lb->next;
Node* pc = Lc;
while (pa && pb) {
if (pa->element < pb->element) {
pc->next = pa;
pa = pa->next;
}
else if (pa->element > pb->element) {
pc->next = pb;
pb = pb->next;
}
else {
pc->next = pa;
pa = pa->next;
pb = pb->next;
}
pc = pc->next;
}
pc->next = pa ? pa : pb;
}
请注意,main()函数必须按如下所示编写:
int main()
{
LinkList La,Lb,Lc;
InitList(La);InitList(Lb);InitList(Lc); //初始化带头结点的单链表(存储int类型数据)
CreateList_Up(La,3); //创建递增单链表(去掉重复数据)
cout<<"Show La:"<<endl;
showList(La); //单链表遍历
CreateList_Up(Lb,4); //创建递增单链表(去掉重复数据)
cout<<"Show Lb:"<<endl;
showList(Lb); //单链表遍历
MergeList(La,Lb,Lc);
cout<<"Show Lc:"<<endl;
showList(Lc); //单链表遍历
return 0;
}
章节03
1. 括号匹配
#include <iostream>
#include <cstring>
using namespace std;
typedef struct {
char data[20];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
void pushStack(Stack *s, char c) {
if (s->top < 19) {
s->data[++(s->top)] = c;
}
}
char popStack(Stack *s) {
if (s->top >= 0) {
return s->data[(s->top)--];
}
return '\0';
}
bool Left(char c) {
return (c == '(' || c == '[' || c == '{');
}
bool Right(char c) {
return (c == ')' || c == ']' || c == '}');
}
bool Matching(string str) {
Stack s;
initStack(&s);
int len = str.length();
for (int i = 0; i < len; i++) {
char c = str[i];
if (Left(c)) {
pushStack(&s, c);
} else if (Right(c)) {
char topC = popStack(&s);
if ((c == ')' && topC != '(') ||
(c == ']' && topC != '[') ||
(c == '}' && topC != '{')) {
return false;
}
}
}
return s.top == -1;
}
请注意,main()函数必须按如下所示编写:
int main()
{
string str;
getline(cin,str);
if(Matching(str)) cout<<"True"<<endl;
else cout<<"False"<<endl;
return 0;
}
2. 循环队列tag
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 3
typedef int Status;
typedef float QElemType;
typedef struct {
QElemType* base;
int front, rear, tag;
} SqQueue;
Status InitQueue(SqQueue& SQ) {
SQ.base = new QElemType[MAXSIZE];
if (!SQ.base) return OVERFLOW;
SQ.front = SQ.rear = 0;
SQ.tag = 0;
return OK;
}
Status EnQueue(SqQueue& SQ, QElemType QE) {
if (SQ.front == SQ.rear && SQ.tag == 1) {
return ERROR;
}
SQ.base[SQ.rear] = QE;
SQ.rear = (SQ.rear + 1) % MAXSIZE;
SQ.tag = 1;
return OK;
}
Status DeQueue(SqQueue& SQ, QElemType& QE) {
if (SQ.front == SQ.rear && SQ.tag == 0) {
return ERROR;
}
QE = SQ.base[SQ.front];
SQ.front = (SQ.front + 1) % MAXSIZE;
SQ.tag = 0;
return OK;
}
请注意,main()函数必须按如下所示编写:
int main()
{
SqQueue Q;
InitQueue(Q);
int i,n;
float f;
cin>>n;
for(i=0;i<n;i++)
{
cin>>f;
if(EnQueue(Q,f)==ERROR) cout<<"Full!"<<endl;
else cout<<"EnQueue:"<<f<<endl;
}
for(i=0;i<n;i++)
{
if(DeQueue(Q,f)==ERROR) cout<<"Empty!"<<endl;
else cout<<"DeQueue:"<<f<<endl;
}
return 0;
}