数据结构习题

Posted edviv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构习题相关的知识,希望对你有一定的参考价值。

一.线性表的逆置算法( a[ 1] .....  a[ n ]) 逆置为( a[ n ] ...... a[ 1 ])

(1)一维数组作存储结构

 1 void invert(SeqList *L, int *num)  //L 为数组,num 为数组元素个数
 2 
 3     int j, tmp;
 4     for(j = 0; j <= *(num-1)/2; j++)
 5     
 6         tmp = L[j];
 7         L[j] = L[*num-j-1];
 8         L[*num-j-i] = tmp;
 9     
10 

(2)单链表作为存储结构

 1 void invert(LinkList L)  //LinkList 为结构体指针类型名
 2 
 3     Node *p, *q, *r;
 4     if(L->next == NULL) return;    //链表为空
 5     p = L -> next;
 6     q = p -> next;
 7     p -> next = NULL;      //摘下第一个结点,生成初始逆置表
 8     while(q != NULL)      //从第二个结点起依次插入当前逆置表
 9     
10         r = q -> next;
11         q -> next = L -> next;
12         L -> next = q;
13         q = r;
14     
15 

二.二叉树:知道前序遍历、中序遍历、后序遍历任意两种即可求出该棵二叉树的形态。

三.求二叉树高度的算法:

 1 int TreeDepth(BiTree t)  //二叉树采用二叉链表存储
 2 
 3     int hl, hr, rel;
 4     if(!t) return 0;
 5     else
 6     
 7         hl = TreeDepth(t -> lchild);
 8         hr = TreeDepth(t -> rchild);
 9         rel = (hl > hr) ? hl + 1 : hr + 1;
10         return (rel);
11     
12 

四.判断循环队列是否满的方法:

(1) 牺牲一个单元不用: 当 Q.front == Q.rear 时队列为空。

                                       当 (Q.rear + 1) % MAXSIZE == Q.front 时队列为满。

(2) 标志域法:设置一个标志域, flag == 0 时队列空,flag == 1 时队列满。

五.在一个顺序表中删除重复元素,不能另外开辟数据存储空间。

(1) 只能删除相邻位置的重复元素,不相邻位置的重复元素保留

 1 #include <iostream>
 2 #include <iomanip>
 3 #include <algorithm>
 4 using namespace std;
 5 int a[1000000], n;
 6 void Deleteup(int a[], int n)
 7 
 8     int i, j, k, count;
 9     i = 0;
10     while(i < n)
11     
12         count = 0;
13         j = i + 1;
14         while(j < n && a[i] == a[j])
15             j++,count++;
16         if(count != 0)
17             for(k = j; k < n; k++)
18                 a[k - count] = a[k];
19         n -= count;
20         i++;
21     
22     for(int l = 0; l < n; l++)
23         cout<<a[l]<<" ";
24 
25 
26 int main()
27 
28     cin>>n;
29     for(int i = 0; i < n; i++)
30         cin>>a[i];
31     Deleteup(a,n);
32     return 0;
33 

(2)所有重复元素都删除。

 1 #include <iostream>
 2 #include <iomanip>
 3 #include <algorithm>
 4 using namespace std;
 5 int a[1000000], n;
 6 void Deleteup(int a[], int n)
 7 
 8     int i, j, k;
 9     i = 0;
10     while(i < n)
11     
12         for(j = i + 1; j < n;)
13         
14             if(a[i] == a[j])
15             
16                 for(k = j; k < n - 1; k++)
17                     a[k] = a[k+1];
18                 n--;
19             
20             else j++;
21         
22         i++;
23     
24     for(int l = 0; l < n; l++)
25         cout<<a[l]<<" ";
26 
27 
28 int main()
29 
30     cin>>n;
31     for(int i = 0; i < n; i++)
32         cin>>a[i];
33     Deleteup(a,n);
34     return 0;
35 

六.采用邻接链表作为有向图的存储结构,编写一个算法计算有向图的出度和入度。

算法:

 1 typedef struct
 2 
 3     int adjvex;
 4     struct ArcNode *nextarc;
 5 ArcNode;
 6 typedef struct
 7 
 8     int data;
 9     int in;
10     int out;
11     ArcNode *firstarc;
12 VNode;
13 typedef struct
14 
15     VNode vertices[NUM];
16     int vexnum;
17     int arcnum;
18 AlGraph;
19 void GetInAndOut(AlGraph &g)
20 
21     int i;
22     ArcNode *p;
23     for(i = 0; i < g.vexnum; i++)
24     
25         p = g.vertices[i].firstarc;
26         while(p != NULL)
27         
28             g.vertices[i].out++;
29             g.vertices[p->adjvex].in++;
30             p = p->nextarc;
31         
32     
33 
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e5+11;
 5 int in[maxn];    //代表入度
 6 int out[maxn];   //代表出度
 7 struct node      //定义一个结构体
 8 
 9     int to;   // 入度
10     int w;    // 权值
11 ;
12 vector <node>g[maxn];    //容器
13 ll n,m;     //n个节点, m 次输入
14 int main()
15 
16     std::ios::sync_with_stdio(0);    //加速器
17     memset(in,0,sizeof(in));    //初始化
18     cin>>n>>m;
19     int a,b,c;       // a  to  b .权值为 c
20     for(int i=1;i<=m;i++)
21     
22         cin>>a>>b>>c;
23         g[a].push_back(nodeb,c);  //终点 和 权值
24     
25     for(int i=1;i<=n;i++)    // n 个结点
26     
27         for(int j=0;j<g[i].size();j++)
28         
29             int q=g[i][j].to;
30             in[q]++;       //桶排原理, 统计入度
31         
32         out[i]=g[i].size();   //统计出度
33     
34     for(int i=1;i<=n;i++)
35         cout<<"节点"<<i<<"的入度是"<<in[i]<<" 出度是"<<out[i]<<endl;
36     return 0;
37 

 

以上是关于数据结构习题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构经典习题

最详细数据结构(C语言版 第2版)课后习题答案全集 严蔚敏 等 编著

-《数据结构题集》习题解析-严蔚敏吴伟民版

-《数据结构题集》习题解析-严蔚敏吴伟民版

-《数据结构题集》习题解析-严蔚敏吴伟民版

-《数据结构题集》习题解析-严蔚敏吴伟民版