Many spectrum access/sharing algorithms for cognitive radio networks (CRNs) have been designed assuming multiple transceivers per CR user. However, in practice, such an assumption may not hold due to hardware cost. In this paper, we address the problem of assigning channels to CR transmissions, assuming one transceiver per CR. The primary goal of our design is to maximize the number of feasible concurrent CR transmissions with respect to both spectrum assignment and transmission power. Energy conservation is also treated, but as a secondary objective. The problem is posed as a utility maximization problem subject to target rate demand and interference constraints. For multi-transceiver CRNs, this optimization problem is known to be NP-hard. However, under the practical setting of a single transceiver per CR user, we show that this problem can be optimally solved in polynomial time. Specifically, we present a centralized algorithm for the channel assignment problem based on bipartite matching. We then integrate this algorithm into distributed MAC protocols. First, we consider a single-hop CRN, for which we introduce a CSMA-like MAC protocol that uses an access window (AW) for exchanging control information prior to data transmissions. This approach allows us to realize a centralized algorithm in a distributed manner. We then develop a distributed MAC protocol (WFC-MAC) for a multi-hop CRN. WFC-MAC improves the CRN throughput through a novel distributed channel assignment that relies only on information provided by the two communicating users. We compare the performance of our schemes with CSMA/CA variants. The results show that our schemes significantly decrease the blocking rate of CR transmissions, and hence improves the network throughput.