单链表实现及基本操作
#include <malloc.h> #include <stdio.h> typedef enum { RET_ERROR, RET_OK } RET_TYPE; typedef struct listNode { int data; struct listNode *pNext; } mylist; mylist* createList() { mylist *pHead = NULL; pHead = (mylist*) malloc(sizeof(mylist)); if (NULL == pHead) { return NULL; } //可以加入对头结点data的特殊处理 pHead->pNext = NULL; return pHead; } mylist* pushBackData(mylist *pHead, int data) { mylist *p = NULL; mylist *q = pHead; if (NULL == pHead) { return NULL; } p = (mylist*) malloc(sizeof(mylist)); if (NULL == p) { return NULL; } p->data = data; p->pNext = NULL; while (NULL != q->pNext) { q = q->pNext; } q->pNext = p; return pHead; } mylist* deleteData(mylist* pHead, int data) { mylist *pPre = NULL; mylist *pCur = NULL; if (NULL == pHead) { return NULL; } pPre = pHead; pCur = pHead->pNext; while (NULL != pCur) { if (pCur->data == data) { break; } pPre = pCur; pCur = pCur->pNext; } if (NULL != pCur) { pPre->pNext = pCur->pNext; free(pCur); pCur = NULL; } return pHead; } RET_TYPE removeList(mylist *pHead) { mylist* p = NULL; if (NULL == pHead) { return RET_ERROR; } //移除链表要将头结点一并删除 p = pHead->pNext; while (NULL != p) { free(pHead); pHead = p; p = p->pNext; } free(pHead); pHead = NULL; return RET_OK; } mylist* findByData(const mylist* pHead, int data) { mylist *p = NULL; if (NULL == pHead) { return NULL; } p = pHead ->pNext; while (NULL != p) { if (p->data == data) { break; } p = p->pNext; } return p; } void printList(const mylist *pHead) { mylist *p = NULL; if (NULL == pHead) { return ; } p = pHead->pNext; while (NULL != p) { printf("%d ",p->data); p = p->pNext; } printf("\n"); } int main() { mylist *pHead = createList(); mylist *p = NULL; if (NULL == pHead) { printf("create failed...\n"); } else { pHead = pushBackData(pHead,1); pHead = pushBackData(pHead,2); pHead = pushBackData(pHead,3); pHead = pushBackData(pHead,4); pHead = pushBackData(pHead,5); printList(pHead); p = findByData(pHead,4); if (NULL != p) { printf("%d\n",p->data); } else { printf("Not exists\n"); } pHead = deleteData(pHead,4); pHead = deleteData(pHead,1); p = findByData(pHead,4); if (NULL != p) { printf("%d\n",p->data); } else { printf("Not exists\n"); } printList(pHead); if (RET_OK == removeList(pHead)) { printf("List removed success.\n"); } } return 0; }