鏈接存儲結構的線性表,它用一組地址任意的存儲單元存放線性表中的數據元素,邏輯上相鄰的元素在物理上不要求也相鄰,不能隨機存取。一般用結點描述:結點(表示數據元素) =數據域(數據元素的映象) + 指針域(指示後繼元素存儲位置)。
鏈表結構定義如下:
typedef struct LinkNode { DataType Data; struct LinkNode *next; }LinkNode, *pLinkNode,*pList;
1.初始化
void initLinkList(pList *pHead) { assert(pHead); *pHead = NULL; }
2.尾插法
int BuyNode(DataType x) //創建一個節點 { pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode)); newNode->Data = x; newNode->next = NULL; } void pushBackList(pList *pHead, DataType x) //尾插法 { pLinkNode newNode = BuyNode(x); pLinkNode cur = *pHead; if (cur == NULL) { *pHead = newNode; } else { while (cur->next) { cur = cur->next; cur->next = newNode; } } }
3.頭插法
void pushFront(pList *pHead, DataType x) //頭插法 { pLinkNode newNode = BuyNode(x); if (*pHead) { *pHead = newNode; } else { newNode->next = (*pHead)->next; *pHead = newNode; } }
4. 尾刪法
void popBack(pList *pHead) //尾刪法 { pLinkNode cur = *pHead; if (*pHead == NULL) //無節點 { return; } else if ((*pHead)->next == NULL) //一個節點 { free(pHead); *pHead = NULL; } else //兩個或兩個以上的結點 { pLinkNode del = *pHead; while (cur->next->Data) { cur = cur->Data; } del = cur->Data; cur->next = NULL; free(del); } }
5.頭刪法
void popFront(pList *pHead) //頭刪法 { if (*pHead == NULL) return; else { pLinkNode del = *pHead; *pHead = (*pHead)->next; free(del); del = NULL; } }
6.在pos前插入x
void Insert(pList *pHead, pLinkNode pos,DataType x) { pLinkNode newNode = BuyNode(x); pLinkNode cur = *pHead; while (cur->next != pos) { cur = cur->next; } newNode->next = cur->next; cur->next = newNode; }
7.翻轉鏈表
void Reverse(pList *pHead) //翻轉鏈表---取出來,頭插 { pLinkNode pnewHead = NULL; pLinkNode cur = *pHead; pLinkNode prev = NULL; while (cur) { prev = cur; cur = cur->next; prev->next = pnewHead; pnewHead = prev; } *pHead = pnewHead; }