數據結構演算法設計題
❶ 數據結構演算法設計題,會的進來看看
迪傑斯特拉演算法 data 數組里存放的是 有向圖的 矩陣表示
QQ 578721802
#include"stdio.h"
#include"stdlib.h"
#defineINT_MAX32676
/**
Dijkstra演算法是用來計算圖中一個
頂點到其餘的所有頂點的
最短距離的演算法
*/
/***
-1表示兩點之間距離是無限大
path[v]表示的這個數組代表了Vx到v的最短路徑
路徑=path[v][0],v,path[v][1],path[v][2]直到一個path[v][x]==-1
Length[v]代表了Vx到v的最短長度:權之和
代碼注釋:
**/
typedefstructgraph{
int**p;
intvertNum;
intarcNum;
}*Graph,g;
typedefstructl{
int*le;
bool*isIn;
}*Le;
intVETNUM=6;
voidinit(Le&L,int**&P,Graph&G);
voidDijikstra(Le&L,int**&P,Graph&G,int&V);
intlastInsert(int*&p,int&x);
voidmyprint(Le&L,int**&p);
intmain(){
LeLength;//某個頂點到其餘所有頂點的最短距離
int**Path;//路徑
intVx;//某個頂點
GraphG;//圖
init(Length,Path,G);
printf("Enterthebeginvertex: ");
scanf("%d",&Vx);
Dijikstra(Length,Path,G,Vx);
myprint(Length,Path);
}
voidmyprint(Le&L,int**&p){
inti,j;
for(i=0;i<6;i++){
printf("%d: ",L->le[i]);
for(j=0;j<6;j++)
printf("%d ",p[i][j]);
printf(" ");
}
}
intlastInsert(int*&p,int&x){
inti;
for(i=0;i<VETNUM;i++){
if(p[i]==-1){
p[i]=x;
return1;
}
}
}
voidinit(Le&L,int**&P,Graph&G){
intdata[6][6]={{-1,-1,10,-1,30,100},{-1,-1,5,-1,-1,-1},
{-1,2,-1,50,-1,-1},{-1,-1,-1,-1,-1,10},
{-1,-1,-1,20,-1,60},{-1,-1,-1,-1,-1,-1}};
intdata1[6][6]={{-1,1,20,80,-1,400},{2,-1,-1,-1,-1,700},
{40,6,-1,4,-1,100},{-1,-1,-1,-1,4,-1},
{-1,-1,-1,-1,-1,3},{-1,-1,-1,-1,-1,-1}};
intvextnum=6;
inti,j;
G=(Graph)calloc(sizeof(g),1);
G->p=(int**)malloc(sizeof(int*)*6);
P=(int**)malloc(sizeof(int*)*6);
L=(Le)calloc(sizeof(structl),1);
L->le=(int*)calloc(sizeof(int),6);
L->isIn=(bool*)calloc(sizeof(bool),6);
for(i=0;i<6;i++){
G->p[i]=(int*)malloc(sizeof(int)*6);
P[i]=(int*)calloc(sizeof(int),6);
}
G->vertNum=6;
for(i=0;i<vextnum;i++)
for(j=0;j<vextnum;j++)
G->p[i][j]=data[i][j],P[i][j]=-1;
/***
for(i=0;i<6;i++)
printf("%d ",L->isIn[i]);
printf("xsaxas");
*/
}
voidDijikstra(Le&L,int**&P,Graph&G,int&V){
intVk;
inti,j;
intMin;
intcheck=0;
/**
首先將L初始化在這裡面必有一條
V到其他頂點的最小值
**/
for(i=0;i<G->vertNum;i++){
L->le[i]=G->p[V][i];
//printf("%d ",L->le[i]);
if(L->le[i]>-1)
check=1;
}
if(check==0)
printf("Error!!"),exit(0);
for(i=1;i<G->vertNum;i++){
Min=INT_MAX;
for(j=0;j<G->vertNum;j++)
if(!L->isIn[j])
{
if(L->le[j]!=-1&&L->le[j]<Min)
{
Vk=j,Min=L->le[j];
}
}
L->isIn[Vk]=true;//將距離Vx最近的點加入到另外一個集合中
//也就是說下一次不要比較
lastInsert(P[V],Vk);
for(j=0;j<G->vertNum;j++){
if((G->p[Vk][j]!=-1)&&!L->isIn[j]
&&(Min+G->p[Vk][j]<L->le[j]))
{
L->le[j]=Min+G->p[Vk][j];
lastInsert(P[j],Vk);
lastInsert(P[j],j);
}
if(L->le[j]==-1&&(G->p[Vk][j]!=-1))
{
L->le[j]=Min+G->p[Vk][j];
lastInsert(P[j],Vk);
lastInsert(P[j],j);
}
}
}
}
❷ 數據結構演算法設計題
對於有序序列的查找,第一時間想到的就應該是二分查找,你這里的需求就是一個二分查找的變異。
public static int Method(int[] nums, int low, int high, int target)
{
while (low <= high)
{
int middle = (low + high) / 2;
if (target == nums[middle])
{
return middle;
}
else if (target > nums[middle])
{
low = middle + 1;
}
else if (target < nums[middle])
{
high = middle - 1;
}
}
if(math.Abs(nums[low ]-target )<=math.Abs(nums[high]-target ))
return low ;
else
return high;
}
❸ 數據結構演算法設計題和2個計算題(重分)
1:
至少為3
進棧:s1,s2,
s3,
s4,
s5,s6
出棧:
s2,
s3,
s4,
s6,s5,s1
棧內
元素
個數:1,2,1,2,1,2,1,2,3,2,1,0
2:
2^0+2+2^2+2^3+……+2^(h-1)=2^h-1
》》[2^h-1]<n<[2^(h+1)-1]
所以h=[log2
(n+1)]向下取整
演算法設計題好久沒看了,很傷腦筋
希望對你有用
❹ 數據結構演算法設計題求解
1.
tempplate<class datatype>
int count(struct node* head,datatype x)
{
int num = 0;
struct node* index = node;
while(index!=NULL)
{
if(x == index->data)
num++;
index = index->next;
}
return num;
}
2.
int func(char A[],int n)
{
int i,j;
int num = 0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(A[j] < A[i])
num++;
}
}
return num;
}
❺ 數據結構演算法設計題
某鏈表中最常用的操作是在最後一個元素之後插入一個元素和刪除最後一個元素,則採用( )存儲方式最節省運算時間. (A)...已知帶頭結點的單鏈表L中的結點是按整數值遞增排列的,試寫一演算法,將值為x 的結點插入到表L中,使得L仍然有序
❻ 數據結構算發題 演算法設計題 1、假設有兩個依元素值遞增有序排列的線性表A和B採用單鏈表Lin
#include"stdio.h"
#include"malloc.h"
struct list
{
int data;
struct list *next;
};
struct list *head1,*head2,*p1,*p2,*q1,*q2;
void main()
{
int n=0;
void unionlist();
p1=q1=(struct list*)malloc(sizeof(struct list));
printf("請輸入第一個鏈表的信息\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
n=n+1;
if(n==1)
head1=q1;
else
q1->next=p1;
q1=p1;
p1=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p1->data);
}
q1->next=NULL;
n=0;
p2=q2=(struct list*)malloc(sizeof(struct list));
printf("請輸入第二個鏈表的信息\n");
scanf("%d",&p2->data);
while(p2->data!=0)
{
n=n+1;
if(n==1)
head2=q2;
else
q2->next=p2;
q2=p2;
p2=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p2->data);
}
q2->next=NULL;
unionlist();
}
void unionlist()
{
struct list *head,*p;
int i=0;
p1=head1;
p2=head2;
head=p=(struct list*)malloc(sizeof(struct list));
p->data=0;
while(p1 && p2)
{
if(p1->data<=p2->data)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
p->next=p1?p1:p2;
p=head;
printf("合並後的鏈表為如下:\n");
while(p)
{
i=i+1;
if(i==1)
p=p->next;
printf("%3d",p->data);
p=p->next;
}
printf("\n");
free(head1);
free(head2);
}
❼ 數據結構,演算法設計題。:1設計演算法實現刪除順序表中多餘重復元素,如:對於順序表(1 . 2 .3 .
先對順序表的元素進行排序,然後比較有重復則刪除
解決方法:
#include <stdio.h>//刪除一列數中重復的數字使之只保留一個
#define N 6
void delete(int a[],int j){int i;
} j=0;
for(i=0;i<N-1;i++)
{ if(a[j]==a[j+1]) {
deletel(a,j);
j--;//沒刪除一個數字j減一,保證遍歷到每個數字
還有一種方法的用兩個順序表,一個為源表(存原數列),一個為目標表,將源表中的元素王目標表中移(有與之相同的則刪除,沒有則保存)
❽ 數據結構c語言版 :演算法設計題 求大神解答。。在線等。。。
/*判斷一段字元串是不是迴文,所謂迴文,也就
是正讀反讀都一樣,如asdffdsa*/
#include<iostream>
#include<stdio.h>
using namespace std;
const int size=100;
class HuiWen
{
private:
char ch[100];
int top;
public:
HuiWen(){top = -1;};
void input(char c);
bool isHuiWen();
bool empty();
};
void HuiWen::input(char c)
{
//if(top==size-1) throw"上溢";
top++;
//cin>>ch[top];
ch[top]= c;
}
bool HuiWen::isHuiWen()
{
for(int i=0;i<top;i++)
if(ch[top--]!=ch[i])
return 0;
return 1;
}
bool HuiWen::empty()
{
if(top==-1)
return 1;
return 0;
}
int main()
{
HuiWen hw;
cout<<"請輸入字元串,以回車鍵結束"<<endl;
int c;
while((c=getchar())!='\n')
hw.input(c); //主要就是這里做了修改。
if(hw.empty())
cout<<"對不起,無字元"<<endl;
else
{
if(hw.isHuiWen())
cout<<"該字元串是迴文"<<endl;
else
cout<<"該字元串不是迴文"<<endl;
}
return 0;
}