6-1 顺序表操作集
/* 你的代码将被嵌在这里 */
List MakeEmpty()
{
List p;
p = (List)malloc(sizeof(struct LNode));
p->Last = -1;
return p;
}
Position Find( List L, ElementType X )
{
int i = 0;
while(i <= L->Last && X != L->Data[i])
i++;
if(i > L->Last)
return ERROR;
return i;
}
bool Insert( List L, ElementType X, Position P )
{
P++;
int j;
if(L->Last == MAXSIZE-1)
{
printf("FULL");
return false;
}
if(P<1 || P>L->Last+2)
{
printf("ILLEGAL POSITION");
return false;
}
for(j=L->Last; j>=P-1; j--)
L->Data[j+1] = L->Data[j];
L->Data[P-1] = X;
L->Last++;
return true;
}
bool Delete( List L, Position P )
{
P++;
int j;
if(P<1 || P>L->Last+1)
{
printf("POSITION %d EMPTY", P-1);
return false;
}
for(j=P; j<=L->Last; j++)
L->Data[j-1] = L->Data[j];
L->Last--;
return true;
}
6-2 带头结点的链式表操作集
/* 你的代码将被嵌在这里 */
List MakeEmpty()
{
List p;
p = (List)malloc(sizeof(struct LNode));
p->Next = NULL;
return p;
}
Position Find( List L, ElementType X )
{
List p = L;
int j=1;
while(p!=NULL && p->Data!=X)
p=p->Next, j++;
if(p==NULL)
return ERROR;
return p;
}
List Findp( List L, Position P )
{
List p = L;
while(p!=NULL && P!=p->Next)
p = p->Next;
if(p==NULL)
return NULL;
return p;
}
bool Insert( List L, ElementType X, Position P )
{
List s;
List flag = Findp(L, P);
if(flag == ERROR)
{
printf("Wrong Position for Insertion\n");
return false;
}
else
{
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = P;
flag->Next = s;
return true;
}
}
bool Delete( List L, Position P )
{
List flag = Findp(L, P);
if(flag == NULL)
{
printf("Wrong Position for Deletion\n");
return false;
}
else
{
flag->Next = P->Next;
free(P);
return true;
}
}
6-3 合并两个有序数组
/* 请在这里填写答案 */
void merge(int* a, int m, int* b, int n, int* c)
{
int i=0, j=0, k=0;
while(i<m&&j<n)
{
if(a[i]<b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i<m)
c[k++] = a[i++];
while(j<n)
c[k++] = b[j++];
}
6-4 线性表元素的区间删除
/* 你的代码将被嵌在这里 */
List Delete( List L, ElementType minD, ElementType maxD )
{
int sum = 0;
for(int i = 0; i <= L->Last; i++)
{
if(L->Data[i]>minD && L->Data[i]<maxD)
sum++;
else
L->Data[i-sum] = L->Data[i];
}
L->Last -= sum;
return L;
}
6-5 递增的整数序列链表的插入
/* 你的代码将被嵌在这里 */
List Insert( List L, ElementType X )
{
List in = (List)malloc(sizeof(struct Node));
in->Data = X, in->Next = NULL;
if(L->Next == NULL)
{
L->Next = in;
return L;
}
List temp = L;
while(temp->Next->Data < X)
{
temp = temp->Next;
if(temp->Next == NULL)
{
temp->Next = in;
return L;
}
}
in->Next = temp->Next;
temp->Next = in;
return L;
}
6-6 两个有序链表序列的合并
/* 你的代码将被嵌在这里 */
List Merge( List L1, List L2 )
{
List L;
L = (List)malloc(sizeof(struct Node));
List t = L, t1 = L1->Next, t2 = L2->Next;
while(t1!=NULL && t2!=NULL)
{
if(t1->Data <= t2->Data)
{
t->Next = t1;
t = t->Next;
t1 = t1->Next;
}
else
{
t->Next = t2;
t = t->Next;
t2 = t2->Next;
}
}
t->Next = t1 == NULL ? t2 : t1;
L1->Next = NULL;
L2->Next = NULL;
return L;
}
6-7 求链表的倒数第m个元素
/* 你的代码将被嵌在这里 */
ElementType Find( List L, int m )
{
List t = L->Next;
int num = 0;
while(t!=NULL)
num++, t = t->Next;
if(m<=0||m>num)
return ERROR;
num -= m;
t = L->Next;
while(num--)
t = t->Next;
return t->Data;
}
6-8 双端队列
/* 你的代码将被嵌在这里 */
bool Push( ElementType X, Deque D )
{
if( (D->Rear+1) % D->MaxSize == D->Front)
return false;
D->Front = (D->Front - 1 + D->MaxSize) % D->MaxSize;
D->Data[D->Front] = X;
return true;
}
ElementType Pop( Deque D )
{
if(D->Front == D->Rear)
return ERROR;//不要写成-1
int t = D->Data[D->Front];
D->Front = (D->Front + 1) % D->MaxSize;
return t;
}
bool Inject( ElementType X, Deque D )
{
if( (D->Rear + 1) % D->MaxSize == D->Front)
return false;
D->Data[D->Rear] = X;
D->Rear = (D->Rear + 1) % D->MaxSize;
return true;
}
ElementType Eject( Deque D )
{
if(D->Front == D->Rear)
return ERROR;//不要写成-1
D->Rear = (D->Rear - 1 + D->MaxSize) % D->MaxSize;
return D->Data[D->Rear];
}
6-9 求二叉树高度
/* 你的代码将被嵌在这里 */
int GetHeight( BinTree BT )
{
if(BT == NULL)
return 0;
int num = 0;
if(BT->Left)
num = num >= GetHeight(BT->Left) ? num : GetHeight(BT->Left);
if(BT->Right)
num = num >= GetHeight(BT->Right) ? num : GetHeight(BT->Right);
return num + 1;
}
6-10 二叉树的遍历
/* 你的代码将被嵌在这里 */
void InorderTraversal( BinTree BT )//中
{
if(BT == NULL)
return;
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ) //前
{
if(BT == NULL)
return;
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ) //后
{
if(BT == NULL)
return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
void LevelorderTraversal( BinTree BT )//层次
{
if(BT == NULL)
return;
BinTree queu[100];
int fro = 0, rear = 0, maxsize = 100;
queu[rear++] = BT;
while(fro != rear)
{
BinTree t = queu[fro++];
fro %= maxsize;
if(t->Left)
queu[rear++] = t->Left;
rear %= maxsize;
if(t->Right)
queu[rear++] = t->Right;
rear %= maxsize;
printf(" %c", t->Data);
}
}
6-11 二叉树的非递归遍历
害 和上面一样
6-12 邻接矩阵存储图的深度优先遍历
/* 你的代码将被嵌在这里 */
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
Visited[V] = true;
Visit(V);
for(int i=0; i<Graph->Nv; i++)
{
int x = Graph->G[V][i];
if(Visited[i] || x == INFINITY)
continue;
DFS(Graph, i, Visit);
}
}
6-13 邻接表存储图的广度优先遍历
void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
{
Vertex queu[100];
int fro = 0, rear = 0, maxsize = 100;
queu[rear] = S;
rear = (rear + 1) % maxsize;
Visited[S] = true;
while(fro != rear)
{
Vertex h = queu[fro];
fro = (fro + 1) % maxsize;
Visit(h);
PtrToAdjVNode t = Graph->G[h].FirstEdge;
while(t != NULL)
{
int i = t->AdjV;
if(Visited[i] != true)
{
Visited[i] = true;
queu[rear] = i;
rear = (rear + 1) % maxsize;
}
t = t->Next;
}
}
}
7-1 一元多项式的乘法与加法运算
链表为空时记得输出“0 0”
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node *List;
struct Node
{
int xi, mi;
List next;
};
List MakeEmpty();
void Insert(List L, Node *x);
void Delete(List L, Node *x);
void in_it();
void solve();
void show(List L);
List a, b, c, d;
char flag;
int main()
{
in_it();
solve();
show(c);
show(d);
}
void in_it()
{
int xi, mi;
a = MakeEmpty();
int n;
scanf("%d", &n);
while(n--)
{
scanf("%d%d", &xi, &mi);
Node *x;
x = (Node*)malloc(sizeof(struct Node));
x->xi = xi, x->mi = mi;
x->next = NULL;
Insert(a, x);
}
b = MakeEmpty();
scanf("%d", &n);
while(n--)
{
scanf("%d%d", &xi, &mi);
Node *x;
x = (Node*)malloc(sizeof(struct Node));
x->xi = xi, x->mi = mi;
x->next = NULL;
Insert(b, x);
}
}
void solve()
{
List ta, tb;
c = MakeEmpty();
ta = a;
while(ta->next != NULL)
{
ta = ta->next;
tb = b;
while(tb->next != NULL)
{
tb = tb->next;
Node *t;
t = (Node*)malloc(sizeof(struct Node));
t->mi = ta->mi + tb->mi;
t->xi = ta->xi * tb->xi;
t->next = NULL;
Insert(c, t);
}
}
d = MakeEmpty();
ta = a;
while(ta->next != NULL)
{
ta = ta->next;
Node *t;
t = (Node*)malloc(sizeof(struct Node));
t->mi = ta->mi;
t->xi = ta->xi;
t->next = NULL;
Insert(d, t);
}
tb = b;
while(tb->next != NULL)
{
tb = tb->next;
Node *t;
t = (Node*)malloc(sizeof(struct Node));
t->mi = tb->mi;
t->xi = tb->xi;
t->next = NULL;
Insert(d, t);
}
}
void show(List L)
{
List t = L;
while(t->next != NULL)
{
t = t->next;
if(t->next == NULL)
printf("%d %d", t->xi, t->mi);
else
printf("%d %d ", t->xi, t->mi);
}
if(L->next == NULL)
puts("0 0");
else
puts("");
}
List MakeEmpty()
{
List L;
L = (List)malloc(sizeof(struct Node));
L->next = NULL;
return L;
}
void Insert(List L, Node *x)
{
if(L->next == NULL)
{
L->next = x;
return;
}
List temp = L;
while(x->mi <= temp->next->mi)
{
temp = temp->next;
if(temp->next == NULL)
break;
}
if(temp->mi == x->mi)
{
if(temp->xi == -x->xi)
Delete(L, temp);
else
temp->xi += x->xi;
}
else
{
x->next = temp->next;
temp->next = x;
}
return;
}
void Delete(List L, Node *x)
{
List t = L;
while(t->next != x)
t = t->next;
t->next = t->next->next;
}
7-2 Reversing Linked List
#include<bits/stdc++.h>
using namespace std;
int Node[100010][2];
int main()
{
int fro, n, k;
scanf("%d%d%d", &fro, &n, &k);
for(int i=0; i<n; i++)
{
int add, data, next;
scanf("%d%d%d", &add, &data, &next);
Node[add][0] = data;
Node[add][1] = next;
}
vector<int> HeadAdd;
while(fro != -1)
{
HeadAdd.push_back(fro);
fro = Node[fro][1];
}
n = HeadAdd.size();
for(int i=0; i+k-1<n; i+=k)
reverse(HeadAdd.begin()+i, HeadAdd.begin()+i+k);
for(int i=0; i<n; i++)
{
printf("%05d %d ", HeadAdd[i], Node[HeadAdd[i]][0]);
(i == n-1) ? printf("-1\n") : printf("%05d\n", HeadAdd[i+1]);
}
return 0;
}
7-3 符号配对
#include<bits/stdc++.h>
using namespace std;
string s;
stack<char> sta;
void solve();
int judge();
int main()
{
s = "";
string t;
while(1)
{
cin >> t;
if(t[0] == '.')
break;
s += t;
}
solve();
return 0;
}
void solve()
{
int n = s.size();
for(int i=0; i<n; i++)
{
char ch = s[i];
switch(ch)
{
case '(':
sta.push('(');
break;
case '{':
sta.push('{');
break;
case '/':
if(i+1<n && s[i+1]=='*')
i++, sta.push('/');
break;
case '[':
sta.push('[');
break;
case '*':
if(i+1<n && s[i+1]=='/')//判断这个 * 不是乘号
{
if(!sta.empty() && sta.top()=='/')
i++, sta.pop();
else
{
if(!judge())
printf("NO\n?-*/");
return;
}
}
break;
case ')':
if(!sta.empty() && sta.top()=='(')
sta.pop();
else
{
if(!judge())
printf("NO\n?-)");
return;
}
break;
case '}':
if(!sta.empty() && sta.top()=='{')
sta.pop();
else
{
if(!judge())
printf("NO\n?-}");
return;
}
break;
case ']':
if(!sta.empty() && sta.top()=='[')
sta.pop();
else
{
if(!judge())
printf("NO\n?-]");
return;
}
break;
}
}
if(sta.empty())
printf("YES\n");
else if(sta.top()=='/')
cout<<"NO\n/*-?";
else if(sta.top()=='(')
cout<<"NO\n(-?";
else if(sta.top()=='[')
cout<<"NO\n[-?";
else if(sta.top()=='{')
cout<<"NO\n{-?";
}
int judge()
{
if(sta.empty())
return 0;
else if(sta.top() == '(')
printf("NO\n(-?");
else if(sta.top() == '[')
printf("NO\n[-?");
else if(sta.top() == '{')
printf("NO\n{-?");
else if(sta.top() == '/')
printf("NO\n/*-?");
return 1;
}
7-4 表达式转换
#include<bits/stdc++.h>
using namespace std;
int level(char x)
{
if(x == '(' || x == ')')
return 3;
else if(x == '*' || x == '/')
return 2;
else if(x == '+' || x == '-')
return 1;
}
int main()
{
string s;
cin >> s;
stack<char> fu;
int flag = 0;
for(unsigned int i=0; i<s.size(); i++)
{
if(((i==0||s[i-1]=='(') && string("+-").find(s[i])!=string::npos) || s[i]=='.' || isdigit(s[i]))
{
if(flag)
putchar(' ');
flag++;
if(s[i]!='+')
putchar(s[i]);
while(s[i+1]=='.' || isdigit(s[i+1]))
{
i++;
putchar(s[i]);
}
}
else
{
if(s[i]==')')
{
while(fu.size() && fu.top()!='(')
{
putchar(' ');
putchar(fu.top());
fu.pop();
}
fu.pop();
}
else if(fu.size()==0 || level(s[i])>level(fu.top()))
{
fu.push(s[i]);
}
else
{
while(fu.size() && fu.top()!='(')
{
putchar(' ');
putchar(fu.top());
fu.pop();
}
fu.push(s[i]);
}
}
}
while(fu.size())
{
putchar(' ');
putchar(fu.top());
fu.pop();
}
}
7-5 银行业务队列简单模拟
#include<bits/stdc++.h>
using namespace std;
int main()
{
queue<int> a, b;
int n;
cin >> n;
for(int i=0; i<n; i++)
{
int t;
cin >> t;
if(t%2 == 1)
a.push(t);
else
b.push(t);
}
int flag = 0;
while(!a.empty() || !b.empty())
{
for(int i=0; i<2; i++)
{
if(!a.empty())
{
if(flag)
cout << ' ';
flag++;
cout << a.front();
a.pop();
}
}
if(!b.empty())
{
if(flag)
cout << ' ';
flag++;
cout << b.front();
b.pop();
}
}
}
7-6 堆栈模拟队列
一个作为输入栈a,一个作为输出栈b。a的栈底元素是队列的队首元素,将a中元素放入b中,那么b的栈顶元素就是队列的队首元素,即可输出。
输入:
a只要没满 输入到a中
a满 b空 a中元素放入b
a满 b不空 ERROR:Full
输出:
b只要不空 输出b.top()
b空 a不空 a中元素放入b,输出b.top()
b空 a空 ERROR:Empty
#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<int> a, b;
int n, m;
cin >> n >> m;
n = min(n, m);
while(1)
{
char ch;
cin >> ch;
if(ch == 'T')
break;
else if(ch == 'A')
{
int tmp;
cin >> tmp;
if(a.size() < n)//a没满
a.push(tmp);
else//a满了
{
if(b.empty())//b为空
{
while(!a.empty())//a中元素放入b中
{
int t = a.top();
a.pop();
b.push(t);
}
a.push(tmp);
}
else//b不为空
{
printf("ERROR:Full\n");
}
}
}
else
{
if(!b.empty())//b不为空
{
int t = b.top();
b.pop();
cout << t << endl;//输出栈顶元素,也就是队首元素
}
else//b为空
{
if(!a.empty())//a不为空
{
while(!a.empty())//a中元素放入b中
{
int t = a.top();
a.pop();
b.push(t);
}
int t = b.top();
b.pop();
cout << t << endl;
}
else//a为空
{
printf("ERROR:Empty\n");
}
}
}
}
}
7-7 串的模式匹配
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
char s[N+5], p[N+5];
int nxt[N+5];
int plen, slen;
void getNext()
{
int i=0,j=-1;
nxt[0]=-1;
while(i<plen)
{
if(j==-1||p[i]==p[j])
nxt[++i]=++j;
else
j=nxt[j];
}
}
int KMP()
{
plen=strlen(p);
slen=strlen(s);
getNext();
int i=0,j=0;
while(i<slen)
{
if(j==-1||s[i]==p[j])
i++, j++;
else
j=nxt[j];
if(j == plen)
return i-j;
}
return -1;
}
int main()
{
scanf("%s", s);
int n;
scanf("%d", &n);
while(n--)
{
memset(nxt, 0, sizeof(nxt));
scanf("%s", p);
int ans=KMP();
if(ans == -1)
printf("Not Found\n");
else
printf("%s\n", s+ans);
}
}
7-8 树的同构
暴力比对
n不等于m No
两个树的相同节点的左右孩子要一样,否则 No
#include<bits/stdc++.h>
using namespace std;
struct node
{
char n, l, r;
};
int judge();
int n, m;
node a[100], b[100];
int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf(" %c %c %c", &a[i].n, &a[i].l, &a[i].r);
scanf("%d", &m);
for(int i=0; i<m; i++)
scanf(" %c %c %c", &b[i].n, &b[i].l, &b[i].r);
int ans = judge();
if(ans)
printf("Yes\n");
else
printf("No\n");
}
int judge()
{
if(n != m)
return 0;
for(int i=0; i<n; i++)
{
int j;
for(j=0; j<m; j++)
{
if(a[i].n == b[j].n)
{
char al, ar, bl, br;
if(a[i].l == '-')
al = -1;
else
al = a[int(a[i].l-'0')].n;
if(a[i].r == '-')
ar = -1;
else
ar = a[int(a[i].r-'0')].n;
if(b[j].l == '-')
bl = -1;
else
bl = b[int(b[j].l-'0')].n;
if(b[j].r == '-')
br = -1;
else
br = b[int(b[j].r-'0')].n;
if( !((al == bl && ar == br) || (al == br && ar == bl)) )
return 0;
break;
}
}
if(j == m)
return 0;
}
return 1;
}
7-9 列出叶结点
由于给的数据不是按“从上到下,从左到右”的顺序给的,所以在创建树的过程中可能会产生多个树,因此用并查集存每个节点的父节点,方便查找根节点。
用队列进行层次遍历
#include<bits/stdc++.h>
using namespace std;
int node[15][2];
int f[15];
int n;
int findx(int x)
{
return f[x] = (x == f[x] ? x : findx(f[x]));
}
void dfs(int x)
{
queue<int> t;
t.push(x);
int flag = 0;
while(!t.empty())
{
int ro = t.front(), l = node[ro][0], r = node[ro][1];
t.pop();
if(l == -1 && r == -1)
{
if(flag++)
printf(" ");
printf("%d", ro);
}
if(l != -1)
t.push(l);
if(r != -1)
t.push(r);
}
}
int main()
{
for(int i=0; i<15; i++)
f[i] = i;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
char l, r;
scanf(" %c %c", &l, &r);
int il, ir;
if(l == '-')
il = -1;
else
il = l - '0';
if(r == '-')
ir = -1;
else
ir = r - '0';
node[i][0] = il, node[i][1] = ir;
if(il != -1)
f[il] = findx(i);
if(ir != -1)
f[ir] = findx(i);
}
int root = findx(0);
dfs(root);
return 0;
}
7-10 修理牧场
哈夫曼树??贪心
#include<bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> > q;//greate升序,less降序
int n, t;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &t);
q.push(t);
}
long long sum = 0;
while(q.size() != 1)
{
int a,b;
a = q.top(), q.pop();
b = q.top(), q.pop();
sum += a+b;
q.push(a+b);
}
printf("%lld\n", sum);
}