In this thesis, we propose a systematic design of binary protograph-based quasi-cyclic (QC) low-density parity-check (LDPC) codes with low error floor. We fifirst characterize the trapping sets of such codes and demonstrate that the QC structure of the code eliminates some of the trapping set structures that can exist in a code with the same degree distribution and girth but lacking the QC structure. Based on this characterization, our design aims at eliminating a targeted collection of trapping sets. Considering the parent/child relationship between the structures of the collection, we search for and eliminate those trapping sets that are in the collection but are not a child of any other trapping set in the collection. An efficient layered algorithm is designed for the search of these targeted trapping sets. Moreover, we design fifinite-length binary irregular QC-LDPC codes with good waterfall performance and low error floor. To achieve a low error floor, we eliminate a targeted set of dominant elementary trapping sets (ETS) in the Tanner graph of the code. This is a more challenging task since the variety of problematic structures is much larger than that of regular codes. The proposed search algorithms perform the construction process with minimal complexity, making it feasible to construct practical codes by running the search algorithm a large number of times. Simulation results are provided to demonstrate the superior performance of designed codes compared to similar state-of-the-art regular/irregular QC-LDPC codes. In addition, we address the problem of characterizing the trapping sets for non-binary (NB) LDPC codes and propose a search algorithm that fifinds the NB trapping sets of both regular and irregular NB-LDPC code within a range of interest exhaustively and with a minimum amount of complexity. Using the proposed search technique, we design regular and irregular NB-QC-LDPC codes with low error floor by removing a given collection of harmful structures. Compared to the existing codes in the literature, the constructed codes have better performance or smaller lengths with the same performance.