C语言输出字母十字,C语言实现图的十字链表(完整代码)

今天我们用c语言将下面的图用代码表示出来。

像下图那样先定义一些结构体

typedef struct Bow//定义弧

{

char head,tail;

struct Bow *hlink,*tlink;

}Bow;

typedef struct FirstNode//定义头结点

{

char data;

Bow *firIn;

Bow *firOut;

}FirstNode;

typedef struct//记录顶点的数量和弧的数量,先定义100顶点

{

FirstNode list[100];

int peak,edge;

}total;

完整代码如下:

#include

#include

#define ERROR 0

typedef struct Bow

{

char head,tail;

struct Bow *hlink,*tlink;

}Bow;

typedef struct FirstNode

{

char data;

Bow *firIn;

Bow *firOut;

}FirstNode;

typedef struct

{

FirstNode list[100];

int peak,edge;

}total;

int LocalBow(char data,total *G)//查询顶点的位置

{

int i;

for(i=0;ipeak;i++)

{

if(G->list[i].data==data)

{

return i;

}

}

return ERROR;

}

void create(total *G)//创建十字链表

{

char x,y;int k,j,i;

printf("请输入图的顶点和弧的数量:");

scanf("%d %d",&G->peak,&G->edge);

for(i=0;ipeak;i++)

{

fflush(stdin);

printf("请输入第%d个顶点的值:",i+1);

scanf("%c",&G->list[i].data);

G->list[i].firIn=G->list[i].firOut=NULL;

}

for(i=0;iedge;i++)

{

fflush(stdin);

printf("请输入,中间用英文逗号隔开:");

scanf("%c,%c",&x,&y);

Bow *R=(Bow *)malloc(sizeof(Bow));

k=LocalBow(x,G);

j=LocalBow(y,G);

R->head=x;

R->tail=y;

R->hlink=G->list[j].firIn;

R->tlink=G->list[k].firOut;

G->list[j].firIn=R;

G->list[k].firOut=R;

}

}

int main()

{

total G;

Bow *t;

create(&G);

int i;

for(i=0;i

{

printf("%c顶点出度情况为:\n",G.list[i].data);

t=G.list[i].firOut;

if(!t)printf("无");

while(t)

{

printf("%c->%c ",t->head,t->tail);

t=t->tlink;

}

printf("\n");

t=G.list[i].firIn;

printf("%c顶点入度情况为:\n",G.list[i].data);

if(!t)printf("无");

while(t)

{

printf("%c->%c ",t->head,t->tail);

t=t->hlink;

}

printf("\n");

}

return 0;

}

运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面十字链表实现两个稀疏矩阵相加的C语言代码: ``` #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 1000 typedef int Status; typedef struct OLNode { int i, j; //非零元素的行列下标 int e; //非零元素的值 struct OLNode *right, *down; //右指针和下指针 } OLNode, *OLink; typedef struct { OLink *rhead, *chead; //行指针和列指针 int m, n, len; //稀疏矩阵的行数、列数和非零元素个数 } CrossList; //十字链表按行插入新节点 Status InsertOLNodeByRow(OLink *rhead, OLink *chead, int i, int j, int e) { OLink p = *rhead, pre = NULL, q = NULL; q = (OLink)malloc(sizeof(OLNode)); q->i = i; q->j = j; q->e = e; while (p && p->i < i) { pre = p; p = p->down; } if (p && p->i == i && p->j < j) { while (p && p->j < j && p->i == i) { pre = p; p = p->right; } } if (p && p->i==i && p->j==j) { p->e += e; free(q); return OK; } q->down = p; if (pre) pre->down = q; else *rhead = q; p = chead[j]; pre = NULL; while (p && p->j<j) { pre = p; p = p->right; } q->right = p; if (pre) pre->right = q; else chead[j] = q; return OK; } //创建稀疏矩阵 Status CreateSMatrix(CrossList *M) { int i, j, k, e; printf("请输入稀疏矩阵的行数、列数和非零元素个数:"); scanf("%d %d %d", &M->m, &M->n, &M->len); M->rhead = (OLink*)malloc((M->m+1)*sizeof(OLink)); M->chead = (OLink*)malloc((M->n+1)*sizeof(OLink)); for (i=0; i<=M->m; i++) M->rhead[i] = NULL; for (i=0; i<=M->n; i++) M->chead[i] = NULL; printf("请依次输入%d个非零元素及其行列下标:\n", M->len); for (k=1; k<=M->len; k++) { printf("第%d个:", k); scanf("%d %d %d",&i,&j,&e); if (InsertOLNodeByRow(&(M->rhead[i]), M->chead, i, j, e) != OK) { printf("插入结点失败!\n"); return ERROR; } } return OK; } //按十字链表格式输出稀疏矩阵 void PrintSMatrix(CrossList M) { int i, j; OLink p = NULL; printf("稀疏矩阵的行数、列数和非零元素个数分别为:%d %d %d\n", M.m, M.n, M.len); for (i=1; i<=M.m; i++) { p = M.rhead[i]; for (j=1; j<=M.n; j++) { if (p && p->j == j) { printf("%d\t", p->e); p = p->right; } else { printf("0\t"); } } printf("\n"); } } //稀疏矩阵相加,结果存储在M3中 Status AddSMatrix(CrossList M1, CrossList M2, CrossList *M3) { if (M1.m != M2.m || M1.n != M2.n) { printf("两个矩阵的行数或列数不等,无法相加!\n"); return ERROR; } int i, j; int e; *M3 = M1; M3->rhead = (OLink*)malloc((M1.m+1)*sizeof(OLink)); M3->chead = (OLink*)malloc((M1.n+1)*sizeof(OLink)); for (i=0; i<=M1.m; i++) M3->rhead[i] = NULL; for (i=0; i<=M1.n; i++) M3->chead[i] = NULL; OLink p = NULL, q = NULL; for (i=1; i<=M1.m; i++) { p = M1.rhead[i]; q = M2.rhead[i]; while (p && q) { if (p->j < q->j) { if (InsertOLNodeByRow(&(M3->rhead[i]), M3->chead, p->i, p->j, p->e) != OK) { printf("插入结点失败!\n"); return ERROR; } p = p->right; } else if (p->j > q->j) { if (InsertOLNodeByRow(&(M3->rhead[i]), M3->chead, q->i, q->j, q->e) != OK) { printf("插入结点失败!\n"); return ERROR; } q = q->right; } else { e = p->e + q->e; if (InsertOLNodeByRow(&(M3->rhead[i]), M3->chead, p->i, p->j, e) != OK) { printf("插入结点失败!\n"); return ERROR; } p = p->right; q = q->right; } } while (p) { if (InsertOLNodeByRow(&(M3->rhead[i]), M3->chead, p->i, p->j, p->e) != OK) { printf("插入结点失败!\n"); return ERROR; } p = p->right; } while (q) { if (InsertOLNodeByRow(&(M3->rhead[i]), M3->chead, q->i, q->j, q->e) != OK) { printf("插入结点失败!\n"); return ERROR; } q = q->right; } } return OK; } int main() { CrossList M1, M2, M3; CreateSMatrix(&M1); CreateSMatrix(&M2); printf("第一个稀疏矩阵:\n"); PrintSMatrix(M1); printf("第二个稀疏矩阵:\n"); PrintSMatrix(M2); AddSMatrix(M1, M2, &M3); printf("相加后的稀疏矩阵:\n"); PrintSMatrix(M3); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值