单链表的实现
首先创建头文件
#pragma #include<stdio.h> #include<assert.h> #include<stdlib.h>
//定义数据类型 typedef int SLDataType; //创建单链表 typedef struct SLinkListNode { SLDataType data; struct SLinkListNode* next; }SLNode;
以下是所需要实现的函数接口
//不会改变头指针,传一级指针 //可能改变头指针,传二级指针 // //创建结点 SLNode* BuySLNode(SLDataType x); //打印 void SListPrint(SLNode* phead); //尾插 void SListPushBack(SLNode** pphead, SLDataType x); //头插 void SListPushFront(SLNode** pphead, SLDataType x); //尾删 void SListPopBack(SLNode** pphead); //头删 void SListPopFront(SLNode** pphead); //在pos前插入x void SListInsert(SLNode** pphead, SLNode* pos, SLDataType x); //找到x的位置并返回 SLNode* SListFind(SLNode* phead, SLDataType x); //删除pos位置的值 void SListErase(SLNode** pphead, SLNode* pos);
接下来是函数的实现
#include"SLinkList.h" //创建新结点 SLNode* BuySLNode(SLDataType x) { SLNode* newnode = (SLDataType*)malloc(sizeof(SLDataType)); if (newnode == NULL) { printf("malloc fail\n"); exit(-1); } newnode->data = x; newnode->next = NULL; return newnode; } //打印 void SListPrint(SLNode* phead) { SLNode* cur = phead; while (cur != NULL) { printf("%d->", cur->data); cur = cur->next; } printf("NULL\n"); } //尾插 void SListPushBack(SLNode** pphead, SLDataType x) { SLNode* newnode = BuySLNode(x); if (*pphead == NULL) { *pphead = newnode; } else { // 找尾节点的指针 SLNode* tail = *pphead; while (tail->next) { tail = tail->next; } // 尾节点,链接新节点 tail->next = newnode; } } //头插 void SListPushFront(SLNode** pphead, SLDataType x) { SLNode* newnode = BuySLNode(x); newnode->next = *pphead; *pphead = newnode; } //尾删 void SListPopBack(SLNode** pphead) { if (*pphead == NULL) { return; } else if ((*pphead)->next == NULL) { free(*pphead); *pphead = NULL; } else { SLNode* prev = NULL; SLNode* tail = *pphead; while (tail->next != NULL) { prev = tail; tail = tail->next; } free(tail); tail = NULL; prev->next = NULL; } } //头删 void SListPopFront(SLNode** pphead) { SLNode* next = (*pphead)->next; free(*pphead); *pphead = next; } //在pos前插入x void SListInsert(SLNode** pphead, SLNode* pos, SLDataType x) { if (pos == *pphead) { SListPushFront(pphead, x); } else { SLNode* newnode = BuySLNode(x); SLNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = newnode; newnode->next = pos; } } //找到x的位置并返回 SLNode* SListFind(SLNode* phead, SLDataType x) { SLNode* cur = phead; while (cur != NULL) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL; } //删除pos位置的值 void SListErase(SLNode** pphead, SLNode* pos) { if (pos == *pphead) { SListPopFront(pphead); } else { SLNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = pos->next; free(pos); pos = NULL; } }