當前位置:首頁 » 服務存儲 » 用c語言存儲無向圖
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用c語言存儲無向圖

發布時間: 2022-12-25 03:22:25

❶ 怎麼用c語言生成一個固定頂點數和固定邊數的無向圖

#defineInfinity1000#defineMaxVertexNum35#defineMAX40#include#include#include#include#includetypedefstructarcell//邊的權值信息{intadj;//權值}arcell,adjmatrix[MaxVertexNum][MaxVertexNum];//圖的鄰接矩陣類型typedefstructvexsinfo//頂點信息{intposition;//景點的編號charname[32];//景點的名稱charintroction[256];//景點的介紹}vexsinfo;typedefstructmgraph//圖結構信息{vexsinfovexs[MaxVertexNum];//頂點向量(數組)adjmatrixarcs;//鄰接矩陣intvexnum,arcnum;//分別指定頂點數和邊數}mgraph;//全局變數intvisited[35];//用於標志是否已經訪問過intd[35];//用於存放權值或存儲路徑頂點編號mgraphcampus;//圖變數(大學校園)//(1)對圖初始化mgraphinitgraph(){inti=0,j=0;mgraphc;c.vexnum=28;//頂點個數c.arcnum=39;//邊的個數for(i=0;i",c.vexs[d[s]].name);//輸出該路徑。s=0時為起點mprintf("%s",c.vexs[d[s]].name);//輸出最後一個景點名(即頂點n的名字,此時s==k)printf("\n\n");}else{s=0;while(sc.vexnum){printf("\n你所輸入的景點編號不存在\n");printf("請重新輸入:");scanf("%d",&v0);}//whilefor(v=0;v%s",c.vexs[w].name);}printf("---->%s",c.vexs[v].name);printf("\n總路線長為%d米\n\n",d[v]);}//for}//shortestpath//(6)-(11)修改圖的信息。包括建圖、更新信息、刪除、增加結點和邊//(6)構造圖的鄰接矩陣intcreatgragh(mgraph&c)//建圖。以圖的鄰接矩陣存儲圖{inti,j,m,n;intv0,v1;intdistance;printf("請輸入圖的頂點數和邊數:\n");scanf("%d%d",&c.vexnum,&c.arcnum);printf("下面請輸入景點的信息:\n");for(i=0;i=0&&n>=0){c.arcs[m][n].adj=distance;c.arcs[n][m].adj=c.arcs[m][n].adj;}}return1;}//creatgragh//(7)更新圖的部分信息。返回值:1intnewgraph(mgraph&c){intchangenum;//計數。用於記錄要修改的對象的個數inti,m,n,t,distance,v0,v1;printf("\n下面請輸入你要修改的景點的個數:\n");scanf("%d",&changenum);while(changenumc.vexnum){printf("\n輸入錯誤!請重新輸入");scanf("%d",&changenum);}for(i=0;ic.arcnum){printf("\n輸入錯誤!請重新輸入");scanf("%d",&changenum);}printf("\n下面請輸入更新邊的信息:\n");for(i=1;i=0&&n>=0){c.arcs[m][n].adj=distance;c.arcs[n][m].adj=c.arcs[m][n].adj;}}return1;}//newgraph

❷ C語言編寫一個無向圖程序,急用,能用的話高分回報

#include <stdlib.h>
#include <conio.h>
#include <time.h>

void Menu();
void Plus();
void Minus();
void Multiply();
void Dir();

int main()
{
int n, flag = 0;
while(1)
{
Menu();
do
{
flag = 0;
scanf("%d", &n);
switch(n)
{
case 1: Plus(); break;
case 2: Minus(); break;
case 3: Multiply(); break;
case 4: Dir(); break;
case 5: exit(0);
default:
{
printf("輸入有誤, 請重新輸入!");
flag = 1;
}
}
}
while(flag);
}
return 0;
}

void Menu()
{
system("cls");
printf("\t\t歡迎來到小學生算數訓練\n");
printf("\t\t\t1.加法訓練\n");
printf("\t\t\t2.減法訓練\n");
printf("\t\t\t3.乘法訓練\n");
printf("\t\t\t4.除法訓練\n");
printf("\t\t\t5.退出\n");
printf("\t\t\t請選擇: ");
}

void Plus()
{
system("cls");
printf("\t\t現在是加法訓練\n\n");
srand((unsigned)time(NULL));
int plu[10][4];
int m, n, result, input;
for(int i = 0; i < 10; i++)
{
m = rand() % 10;
n = rand() % 10;
printf("請計算: %d + %d = ", m, n);
result = m + n;
scanf("%d", &input);
if(input != result)
printf("真可惜, 回答錯誤, 請再接再厲!\n");
else
printf("恭喜你, 回答正確, 請繼續加油!\n");
plu[i][0] = m;
plu[i][1] = n;
plu[i][2] = input;
plu[i][3] = result;
}
printf("===============十道題目回答如下=================\n\n");
for(int j = 0; j < 10; j++)
{
printf("%d + %d = %d\t", plu[j][0], plu[j][1], plu[j][2]);
if(plu[j][2] != plu[j][3])
printf("(正確答案為%d)", plu[j][3]);
printf("\n");
}
printf("輸入任意鍵返回主菜單\n");
getch();
}

void Minus()
{
system("cls");
printf("\t\t現在是減法訓練\n\n");
srand((unsigned)time(NULL));
int plu[10][4];
int m, n, result, input;
for(int i = 0; i < 10; i++)
{
do
{
m = rand() % 10;
n = rand() % 10;
}while(m < n);
printf("請計算: %d - %d = ", m, n);
result = m - n;
scanf("%d", &input);
if(input != result)
printf("真可惜, 回答錯誤, 請再接再厲!\n");
else
printf("恭喜你, 回答正確, 請繼續加油!\n");
plu[i][0] = m;
plu[i][1] = n;
plu[i][2] = input;
plu[i][3] = result;
}
printf("===============十道題目回答如下=================\n\n");
for(int j = 0; j < 10; j++)
{
printf("%d - %d = %d\t", plu[j][0], plu[j][1], plu[j][2]);
if(plu[j][2] != plu[j][3])
printf("(正確答案為%d)", plu[j][3]);
printf("\n");
}
printf("輸入任意鍵返回主菜單\n");
getch();
}

void Multiply()
{
system("cls");
printf("\t\t現在是乘法訓練\n\n");
srand((unsigned)time(NULL));
int plu[10][4];
int m, n, result, input;
for(int i = 0; i < 10; i++)
{
m = rand() % 10;
n = rand() % 10;
printf("請計算: %d * %d = ", m, n);
result = m * n;
scanf("%d", &input);
if(input != result)
printf("真可惜, 回答錯誤, 請再接再厲!\n");
else
printf("恭喜你, 回答正確, 請繼續加油!\n");
plu[i][0] = m;
plu[i][1] = n;
plu[i][2] = input;
plu[i][3] = result;
}
printf("===============十道題目回答如下=================\n\n");
for(int j = 0; j < 10; j++)
{
printf("%d * %d = %d\t", plu[j][0], plu[j][1], plu[j][2]);
if(plu[j][2] != plu[j][3])
printf("(正確答案為%d)", plu[j][3]);
printf("\n");
}
printf("輸入任意鍵返回主菜單\n");
getch();
}

void Dir()
{
system("cls");
printf("\t\t現在是除法訓練\n\n");
srand((unsigned)time(NULL));
int plu[10][4];
int m, n, result, input;
for(int i = 0; i < 10; i++)
{
do
{
m = rand() % 10;
n = rand() % 10;
}while(m == 0 || n == 0);
result = m * n;
int temp;
temp = m;
m = result;
result = temp;
printf("請計算: %d / %d = ", m, n);
scanf("%d", &input);
if(input != result)
printf("真可惜, 回答錯誤, 請再接再厲!\n");
else
printf("恭喜你, 回答正確, 請繼續加油!\n");
plu[i][0] = m;
plu[i][1] = n;
plu[i][2] = input;
plu[i][3] = result;
}
printf("===============十道題目回答如下=================\n\n");
for(int j = 0; j < 10; j++)
{
printf("%d / %d = %d\t", plu[j][0], plu[j][1], plu[j][2]);
if(plu[j][2] != plu[j][3])
printf("(正確答案為%d)", plu[j][3]);
printf("\n");
}
printf("輸入任意鍵返回主菜單\n");
getch();
}

❸ 無向圖G.,有n個頂點,m條邊,如何採用鄰接表存儲該圖主要是想知道演算法~用c語言

無向圖就是不分方向的圖
連接表的橫列有N項,縱列也是N項
形成的N*N項每項都被稱為邊結點
每項都有縱橫兩個坐標,例如點(N,N-1),表示的就是從第N點向第N-1點有無路徑。
由於有E條邊,自然有E條路徑,但是由於無向,=雙向,所以要乘以二

❹ 請教編程大神數據結構題目:c語言使用鄰接鏈表存儲結構實現用戶輸入的無向圖的連通性判斷

#include<stdio.h>
#include<stdlib.h>
#defineMAX_VERTEX_NUM100
typedefstructArcNode{
intadjvex;//該邊的另一個頂點的位置
structArcNode*nextarc;//指向下一條邊
}ArcNode;
typedefstructVNode{
intdata;//頂點的值
ArcNode*firstarc;//指向第一條依附該頂點的邊的指針
}VNode,AdjList[MAX_VERTEX_NUM];
typedefstruct{
AdjListvertices;//頂點數組
intvexnum,arcnum;
}ALGraph;
intLocateVex(ALGraphG,intv){//定位函數
for(inti=0;i<G.vexnum;i++){
if(v==G.vertices[i].data)returni;
}
}
voidCreateUDG(ALGraph&G){
ArcNode*p,*q;
inti,j,k,v1,v2;
printf("分別輸入頂點個數和邊的數目: ");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("分別輸入各個頂點值: ");
for(i=0;i<G.vexnum;i++){
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;//初始化
}
printf("分別輸入各條邊的兩個頂點: ");
for(k=0;k<G.arcnum;k++){
scanf("%d%d",&v1,&v2);
i=LocateVex(G,v1);j=LocateVex(G,v2);//定位
p=(ArcNode*)malloc(sizeof(ArcNode));//申請一個結點
p->adjvex=j;p->nextarc=NULL;//賦值
p->nextarc=G.vertices[i].firstarc;//連接結點
G.vertices[i].firstarc=p;//連接結點
q=(ArcNode*)malloc(sizeof(ArcNode));
q->adjvex=i;q->nextarc=NULL;
q->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=q;
}
}
voidPrintUDG(ALGraphG){//輸出鄰接表
inti,j;
for(i=0;i<G.vexnum;i++){
printf("%d:",i);
ArcNode*p;
p=G.vertices[i].firstarc;
while(p!=NULL){
printf("->%d",p->adjvex);
p=p->nextarc;
}
printf(" ");
}
}
intmain(){
ALGraphG;
CreateUDG(G);
PrintUDG(G);
return0;
}

❺ C語言實現無向圖

可以用鄰接矩陣表示法:

#define max 100
typedef struct
{
int vex[max];//存儲頂點值,類型可以變
int edge[max][max];//存儲頂點之間的關系,以1或者0表示,1為有邊,0為無
int e,v;//vertex存儲頂點數,edge存儲邊的條數,所以無向圖1的個數是邊的個數的兩倍,謝謝。
}m;