一、单链表结构的定义
//单链表结构的定义 typedef int SLNDataType;//数据类型 typedef struct SListNode { SLNDataType val;//结点数据域 struct SListNode* next;//结点指针域 }SLNode;
二、单链表结点的创建
//单链表结点的创建 SLNode* CreateNode(SLNDataType x) { SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));//为新结点申请空间 if (newnode == NULL)//申请失败 { perror("malloc fail"); exit(-1); } newnode->val = x;//新结点数据域 newnode->next = NULL;//新结点指针域 return newnode; }
三、单链表打印
//单链表的打印 void SLTPrint(SLNode* phead) { SLNode* cur = phead; while (cur) { printf("%d->", cur->val); cur = cur->next; } if (cur == NULL) printf("NULL\n"); }
四、单链表尾插
//单链表的尾插 void SLTPushBack(SLNode** pphead, SLNDataType x) { assert(pphead); SLNode* newnode = CreateNode(x); //链表为空 if (*pphead == NULL) { *pphead = newnode; } else//链表不为空 { SLNode* tail = *pphead; while (tail->next)//找尾结点 { tail = tail->next; } tail->next = newnode;//尾插 } }
五、单链表头插
//单链表头插 void SLTPushFront(SLNode** pphead, SLNDataType x) { assert(pphead); SLNode* newnode = CreateNode(x); newnode->next = *pphead; *pphead = newnode; //SLNode* newnode = CreateNode(x); 链表为空 //if (*pphead == NULL) //{ // *pphead = newnode; //} //else//链表不为空 //{ // SLNode* tmp = *pphead; // *pphead = newnode; // (*pphead)->next = tmp; //} }
六、单链表尾删
//单链表尾删 void SLTPopBack(SLNode** pphead) { assert(pphead); assert(*pphead);//链表不能为空 if ((*pphead)->next == NULL)//链表只有一个结点 { free(*pphead); *pphead = NULL; } else//链表有多个结点 { SLNode* tail = *pphead; SLNode* prev = NULL; while (tail->next != NULL) { prev = tail; tail = tail->next; } prev->next = NULL; free(tail); tail = NULL; } }
七、单链表头删
//单链表头删 void SLTPopFront(SLNode** pphead) { assert(pphead); assert(*pphead); //SLNode* tmp = *pphead; //*pphead = (*pphead)->next; //free(tmp); //tmp = NULL; SLNode* tmp = (*pphead)->next; free(*pphead); *pphead = tmp; }
八、单链表查找(返回找到的结点)
//单链表查找(返回找到的结点) SLNode* SLTFind(SLNode* phead, SLNDataType x) { if (phead == NULL) return NULL; else { SLNode* cur = phead; while (cur) { if (cur->val == x) return cur; cur = cur->next; } return cur;//return NULL; } }
九、单链表任意位置插入
//单链表任意位置插入 void SLTInsert(SLNode** pphead, SLNode* pos, SLNDataType x) { assert(pphead); assert(pos);//必须在有效结点处插入 assert(*pphead);//如果pos是有效结点,那么链表一定不为空 SLNode* newnode = CreateNode(x); if (*pphead == pos)//插入位置在头结点处 { //头插 SLTPushFront(pphead, x); } else { SLNode* cur = *pphead; while (cur->next != pos)//找插入位置的前一结点 { cur = cur->next; } newnode->next = cur->next; cur->next = newnode; } }
十、单链表任意位置删除
//单链表任意位置删除 void SLTErase(SLNode** pphead, SLNode* pos) { assert(pphead); assert(pos);//删除的必须是有效结点 assert(*pphead);//链表不能为空 if (*pphead == pos)//删除的结点是头结点 { //头删 SLTPopFront(pphead); } else { SLNode* cur = *pphead; while (cur->next != pos)//找删除结点的前一结点 { cur = cur->next; } cur->next = pos->next; free(pos); pos = NULL; } }
十一、单链表任意位置后插入
//单链表任意位置后插入 void SLTInsertAfter(SLNode* pos, SLNDataType x) { assert(pos);//必须是有效结点 SLNode* newnode = CreateNode(x); newnode->next = pos->next; pos->next = newnode; }
十二、单链表任意位置后删除
//单链表任意位置后删除 void SLTEraseAfter(SLNode* pos) { assert(pos);//必须是有效结点 assert(pos->next);//如果pos是最后一个结点,那么pos的后一位置为空 SLNode* tmp = pos->next; pos->next = tmp->next; free(tmp); tmp = NULL; }
十三、单链表任意位置插入(不提供链表头结点)
先进行任意位置后插入,再交换两个结点的值
//单链表任意位置插入(不提供链表头结点) void SLTInsertNohead(SLNode* pos, SLNDataType x) { assert(pos); SLTInsertAfter(pos, x);//先在pos位置后插入 pos->next->val = pos->val; pos->val = x; }