#include <iostream> #include <cstdlib> using namespace std; typedef struct node{ char m_nValue; struct node *m_pNext; }Node,*pNode; void CreateList(pNode *pHead) { pNode pCurrent, pTemp; pCurrent = pTemp = (pNode)malloc(sizeof(Node)); printf("please input the data:"); scanf_s("%c", &pTemp->m_nValue); *pHead = NULL; while (pTemp->m_nValue != '#') { if (NULL == *pHead) { *pHead = pCurrent; } else { pCurrent->m_pNext = pTemp; } pCurrent = pTemp; pTemp = (pNode)malloc(sizeof(Node)); scanf_s("%c", &pTemp->m_nValue); pTemp->m_pNext = NULL; } } void AddToTail(pNode *pHead, char elem) { pNode tempCell; tempCell = (pNode)malloc(sizeof(Node)); if (NULL == tempCell) { printf(" malloc failed\n"); exit(1); //指示程序在退出时将数字1返回给操作系统 } tempCell->m_nValue = elem; tempCell->m_pNext = NULL; if (*pHead == NULL) { *pHead = tempCell; } else { pNode pTemp = *pHead; while (pTemp->m_pNext != NULL) pTemp = pTemp->m_pNext; pTemp->m_pNext = tempCell; } } void Insert(pNode pHead, int position, char elem) {//在position位置上插入elem结点 以0为第一个位置 pNode pCell; pNode pTemp; pTemp = pHead; int n = 0; while (n != position && pTemp->m_pNext != NULL) { pTemp = pTemp->m_pNext; } if (position > n) { printf("wrong position\n"); } else { pCell = (pNode)malloc(sizeof(Node)); if (NULL == pCell) { printf(" malloc failed\n"); exit(1); //指示程序在退出时将数字1返回给操作系统 } pCell->m_nValue = pTemp->m_nValue; //实现了在不改变头指针的情况下将元素插入到第0个位置 pTemp->m_nValue = elem; pCell->m_pNext = pTemp->m_pNext; pTemp->m_pNext = pCell; } } // 判断链表是否为空 int IsEmpty(pNode pHead) { return pHead->m_pNext == NULL; } // 判断当前位置是否为链表末尾 int IsLast(pNode pPosition) { return pPosition->m_pNext == NULL; } // 查找元素 pNode find(pNode pHead, char x) { pNode pTemp = pHead->m_pNext; while (pTemp != NULL && pTemp->m_nValue != x) { pTemp = pTemp->m_pNext; } return pTemp; } void RemoveNode(pNode *pHead, char x) {// 移除第一个含有x的结点 if (pHead == NULL || *pHead == NULL) { return; } pNode pToBeDeleted = NULL; if ((*pHead)->m_nValue == x) { pToBeDeleted = *pHead; *pHead = (*pHead)->m_pNext; } else { pNode pTemp = (*pHead); while (pTemp->m_pNext != NULL && pTemp->m_pNext->m_nValue != x) { pTemp = pTemp->m_pNext; } if (pTemp->m_pNext != NULL && pTemp->m_pNext->m_nValue == x) { pToBeDeleted = pTemp->m_pNext; pTemp->m_pNext = pTemp->m_pNext->m_pNext; } } if (pToBeDeleted != NULL) { delete pToBeDeleted; pToBeDeleted = NULL; } } void Delete(pNode *pHead, char x) {//删除多个x的结点 pNode p1,p2; p1 = *pHead; p2 = NULL; if (p1 == NULL) { return; } else { while (p1->m_nValue == x) {// 连续多个结点要删除的结点在头结点处 (*pHead) = (*pHead)->m_pNext; free(p1); p1 = (*pHead); } while (p1 != NULL) { p2 = p1; p2 = p2->m_pNext; while (p2->m_nValue == x && p2->m_pNext != NULL) { p1->m_pNext = p2->m_pNext; free(p2); p2 = p1; p2 = p2->m_pNext; } if (p2->m_pNext == NULL) { if (p2->m_nValue == x) { free(p2); p1->m_pNext = NULL; } else { p1->m_pNext = p2; } break; } else { p1 = p2; } } } } void DeleteList(pNode *pHead) { pNode pTemp, pCell; pCell = *pHead; *pHead = NULL; while (NULL != pCell) { pTemp = pCell->m_pNext; free(pCell); pCell = pTemp; } } void Reverse(pNode *pHead) { if ((NULL == *pHead)) return; //边界检测 pNode pPre = NULL; //先前指针 pNode pCur = *pHead; //当前指针 pNode pNext = NULL; //后继指针 while (pCur != NULL) { pNext = pCur->m_pNext; pCur->m_pNext = pPre; pPre = pCur; pCur = pNext; } *pHead = pPre; //记录下新的头结点 } void PrintList(pNode pHead) { pNode pTemp = pHead; //pHead 虽然为Node* 也有相应的存储空间,但是他是头指针,m_nValue没有值 while (pTemp != NULL && pTemp->m_pNext != NULL) { printf("%c ", pTemp->m_nValue); pTemp = pTemp->m_pNext; } printf("%c \n", pTemp->m_nValue); } int main() { pNode myList = NULL; pNode pTemp = NULL; CreateList(&myList); Delete(&myList, 'b'); AddToTail(&myList,'d'); PrintList(myList); Insert(myList, 0, 'a'); //插入元素 pTemp = find(myList, 'c'); Delete(&myList, 'b'); PrintList(myList); Reverse(&myList); PrintList(myList); DeleteList(&myList); system("pause"); return 0; }
数据结构List
猜你喜欢
转载自blog.csdn.net/dabenxiong_1/article/details/47820347
今日推荐
周排行