时间复杂度-给定一组边,我可以按Ov + e升序创建邻接链表

问题描述

我了解如何在O(v + e)中创建邻接表。现在,我的实现扫描边缘,然后将其推入各个顶点的邻接列表。例如,输入为:

1 2

3 6

4 2

1 6

5 3

输出将是

1: 2,6
2: 1,4
3: 5,6
4: 2
5: 3
6: 1,3

边缘以任意顺序给出。

每个节点都有一个列表。我希望列表按升序排列。我坚信没有办法在固定时间内按升序推入邻接表。我错了吗?

这是我的代码

#include <stdio.h>
#include <stdlib.h>

// created linked list and Node structures
typedef struct node{
    int vertexnumber;
    struct node* next;
} Node;

typedef struct linkedList{
    Node* head;
    int size;
} LinkedList;

void getNumberOfVerticesAndEdges(FILE* fp,int* vertices,int* edges);
void push(LinkedList* linkedList,int vertex);
Node* createNode(int vertexnumber);
void printAdjacencyLists(LinkedList** arrayOfLinkedLists,int vertices,int edges);
LinkedList** createLinkedList(int numOfVertices);
void formatList(LinkedList** array,int vertices);

int main(void){
    // creating the file pointer
    FILE *fptr = fopen("input-machine-problem-1.txt","r");
    if (fptr == NULL) {
        printf("Error! opening file");
        return 0;
    }

    int edges;
    int vertices;
    int* edgesPtr = &edges;
    int* verticesPtr = &vertices;
    // gets the number of vertices and edges in the file
    getNumberOfVerticesAndEdges(fptr,verticesPtr,edgesPtr); // O(e)
    // creating an array of linked lists,each list stores adjacency list for a vertex
    LinkedList** arrayOfLinkedLists = createLinkedList(vertices);

    int x,y;
    if(fptr == NULL){
        return 0;
    }
    // rewind so that any outside functions (getNumberOfVerticesAndEdges for example) reading file do not move 
    // the pointer to a spot that will affect the algorithm belowe
    rewind(fptr);
    // looping for every vertice,scan and push each edge causing O(v * e) time complexity
    for(int i = 0; i < edges; i++){
        // read each edge from the file
        if(feof(fptr)){
            return 0;
        }
        fscanf (fptr,"%d %d",&x,&y);  
        push(arrayOfLinkedLists[x - 1],y);
        push(arrayOfLinkedLists[y - 1],x);
    }

    // implementation makes use of setting a temp node to each linked list initialized so funciton below removes that temp node
    formatList(arrayOfLinkedLists,vertices);
    // prints adjacency lists in readable format
    printAdjacencyLists(arrayOfLinkedLists,vertices,edges);
    // closes file
    fclose(fptr); 
}

// O(v)
// input array of LinkedLists,and int value for a new nodes vertex that is being pushed
void push(LinkedList* linkedList,int vertex){
    // creates new node with input int
    Node* newNode = createNode(vertex);
    // functionality below creates a pointer that will traverse the linked list,moving the new node over 1 position
    // until it finds a node that is greater than the new node,so new node will be node right before the first 
    // one greater than it
    Node temp;
    Node* cur = &temp;
    temp.next = linkedList->head;

    while(cur->next != NULL && cur->next->vertexnumber < newNode->vertexnumber){
        cur = cur->next;
    }
    if(cur->next->vertexnumber == newNode->vertexnumber){
        return;
    }
    newNode->next = cur->next;
    cur->next = newNode;
    linkedList->head = temp.next;
}

// removes place holder node
void formatList(LinkedList** array,int vertices){
    for(int i = 0;i < vertices; i++){
        Node* temp = array[i]->head;
        Node* prev = temp;
        while(temp->next != NULL){
            prev = temp;
            temp = temp->next;
        }
        prev->next = NULL;
    }
}

// creates array of linked lists and initializes each list with a temp/place holder node
LinkedList** createLinkedList(int numOfVertices){
    LinkedList** array = malloc(sizeof(LinkedList) * numOfVertices);
    for(int i = 0; i < numOfVertices; i++){
        LinkedList* newLinkedList = malloc(sizeof(LinkedList));
        Node* temp = createNode(99);
        newLinkedList->head = temp;
        array[i] = newLinkedList;
    }
    return array;
}

// allocates memory for a node and sets its vetex int value
Node* createNode(int vertexnumber){
    Node* newNode = malloc(sizeof(Node));
    if(!newNode){
        return NULL;
    }
    newNode->vertexnumber = 0;
    newNode->next = NULL;
    newNode->vertexnumber = vertexnumber;

    return newNode;
}

// scans through file and looks for greatest int and increments int holding num of edges for every new line of ints read
void getNumberOfVerticesAndEdges(FILE* fp,int* edges){
    int x,y;
    
    if (fp == NULL) {
        printf("Error! opening file");
        return;
    } 

    *vertices = 0;
    *edges = 0;
    while (fscanf(fp,&y) == 2) {
        if(x > *vertices){
            *vertices = x;
        } if (y > *vertices){
            *vertices = y;
        }

        *edges = (*edges) + 1;
    }
}

// traverses each linked list and prints its vertices value
void printAdjacencyLists(LinkedList** arrayOfLinkedLists,int edges){
    for(int i = 0; i < vertices; i++){
        printf("%d:  ",i + 1);
        if(arrayOfLinkedLists[i]->head == NULL){
            return;
        }
        Node* cur = arrayOfLinkedLists[i]->head;

        while(cur != NULL){
            printf("%d --> ",cur->vertexnumber);
            cur = cur->next;
        }
        printf("NULL\n");
        free(cur);
    }
}

唯一相关的部分是main和我的push方法中的for循环,因为它们是影响复杂性的两个因素

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)