- #include<stdio.h>
- #include<stdlib.h>
- #define ok 1
- #define error 0
- typedef struct node{
- int i, j;
- int e;
- struct node *right, *down;
- }node, *linklist;
- typedef struct{
- int mu, nu, tu;
- linklist *rhead, *chead;
- }crosslist;
- int init_crosslist(crosslist &M){
- M.rhead = M.chead = NULL;
- M.nu = M.mu = M.tu = 0;
- return ok;
- }
- int creat_crosslist(crosslist &M){
- linklist bulid, p, judge;//pointer
- int m, n, t, i, j, e, k, judge_number;
- printf("输入稀疏矩阵的行,列以及非零元素个数\n");
- scanf("%d%d%d",&m, &n, &t);
- M.mu = m;
- M.nu = n;
- M.tu = t;
- // 行,和列进行初始化
- M.rhead = (linklist *)malloc((m+1)*sizeof(linklist));
- for(k=1; k <= m; k++){
- M.rhead[k] = NULL;
- }
- M.chead = (linklist *)malloc((n+1)*sizeof(linklist));
- for(k = 1; k <= n; k++){
- M.chead[k] = NULL;
- }
- printf("输入非零元素行,列,非零元素\n");
- for(k=0; k<t; k++){
- scanf("%d%d%d",&i,&j,&e);
- // 判断 是否重复的输入数据,如果重复则程序结束
- for(judge_number = 1; judge_number <= m; judge_number++){
- judge = M.rhead[judge_number];
- while(judge!=NULL){
- if(judge->i == i && judge->j ==j ){
- printf("此位置已经存在元素,程序将结束\n");
- system("pause");
- exit(0);
- }
- judge = judge->right;
- }
- }
- // 判断是不是超出范围
- if(i>M.mu || j>M.nu){
- printf("位置不合法! 无法完成操作!\n");
- system("pause");
- exit(0);
- }
- // 新建立的结点进行初始化
- bulid=(linklist)malloc(sizeof(node));
- bulid->i = i;
- bulid->j = j;
- bulid->e = e;
- bulid->right = NULL;
- bulid->down = NULL;
- // 完成行插入
- if(M.rhead[i] == NULL || M.rhead[i]->j > j){
- bulid->right = M.rhead[i];
- M.rhead[i] = bulid;
- }
- else{
- p = M.rhead[i];
- while(p->right != NULL && p->right->j < j){
- p = p->right;
- }
- bulid->right = p->right;
- p->right = bulid;
- }
- // 完成列插入
- if(M.chead[j] == NULL || M.chead[j]->i > i){
- bulid->down = M.chead[j];
- M.chead[j] = bulid;
- }
- else{
- p=M.chead[j];
- while(p->down != NULL && p->down->i < i){
- p=p->down;
- }
- bulid->down = p->down;
- p->down = bulid;
- }
- }
- return ok;
- }
- void print_list(crosslist &M){
- int row_i, col_j;
- linklist print;
- printf("稀疏矩阵为\n");
- for(row_i = 1; row_i <= M.mu; row_i++){
- print=M.rhead[row_i];
- for(col_j = 1; col_j <= M.nu; col_j++){
- if(print != NULL && print->j == col_j){
- printf("%d\t", print->e);
- print = print->right;
- }
- else{
- printf("%d\t",NULL);
- }
- }
- printf("\n");
- }
- }
- int main()
- {
- crosslist M;
- char choice;
- while(choice!='n'&&choice!='N'){
- init_crosslist(M);
- creat_crosslist(M);
- print_list(M);
- printf("是否要继续操作? Y/N\n");
- choice = getchar();
- choice = getchar();
- system("cls");
- }
- return 0;
- }
十字链表(写的很漂亮呀!)
最新推荐文章于 2022-04-21 21:05:34 发布