单链表的基本操作(尾插,尾删,头插,头删,查找,指定位置插入、删除,指定元素删除、全部删除等)
2017-08-01 13:53
736 查看
LinkList.h
LinkList.c
#include "LinkList.h"
void InitLinkLinst(pList *pplist)//初始化
{
*pplist = NULL;
}
void PushBack(pList* pplist, DataType d)//尾插
{
Node* cur = *pplist;
Node *p = malloc(sizeof(Node));//动态开辟一块空间存放插入元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
if (cur == NULL)//空链表
{
*pplist = p;
}
else //非空链表
{
while (cur->next != NULL)
{
cur = cur->next;//找到尾部
}
cur->next = p;
}
}
//void Display(pList* pplist)//循环打印
//{
// Node* cur = pplist;
//
// for (; cur != NULL; cur = cur->next)
// {
// printf("%d ",cur->data);
// }
// printf("\n");
//}
void Display(const pList pplist)//递归打印
{
if (pplist == NULL)
{
printf("\n");
}
else
{
printf("%d-->", pplist->data);
Display(pplist->next);
}
}
void PopBack(pList* pplist)//尾删
{
Node* cur = *pplist;
Node* previous = NULL;//用来记录要删除的前一个位置
if (cur == NULL)//空链表
{
return;
}
while (cur->next != NULL)
{
previous = cur;
cur = cur->next;
}
if (previous != NULL)//多于一个节点
{
previous->next = NULL;
free(cur);
}
else//只有一个节点
{
free(cur);
*pplist = NULL;
}
}
void PushFront(pList* pplist, DataType d)//头插
{
Node* cur = *pplist;
Node *p = malloc(sizeof(Node));//动态开辟一块内存用来存放插入的元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
p->next = *pplist;//将插入元素的next指针指向原链表的头结点
*pplist = p;//链表重置后的新的头结点
}
void PopFront(pList* pplist)//头删
{
Node* cur = *pplist;
if (cur == NULL)//空链表
{
return;
}
else //非空链表
{
*pplist = cur->next;//链表重置后的新的头结点
free(cur);
}
}
pNode Find(pList* pplist, DataType d)//查找元素,若找到了返回位置,没找到返回空指针
{
Node* cur = *pplist;
while (cur != NULL)
{
if (cur->data == d)
{
return cur;
}
else
{
cur = cur->next;
}
}
return NULL;
}
void Insert(pList* pplist, DataType d, int pos)//指定位置插入
{
int i = 0;
Node* cur = *pplist;
Node* previous = NULL;
Node *p = malloc(sizeof(Node));//动态开辟一块内存用来存放插入的元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
if (cur == NULL)//空链表
{
*pplist = p;//链表重置后的新的头结点
return;
}
for (i = 0; (i < pos)&&(cur->next != NULL); i++)//找到指定位置
{
previous = cur;
cur = cur->next;
}
if (previous == NULL)//在最前边插入
{
p->next = cur;
*pplist = p;
}
else
{
p->next = cur;
previous->next = p;
}
}
void Erase(pList* pplist, int pos)//删除指定位置
{
int i = 0;
Node* cur = *pplist;
Node* previous = NULL;
if (cur == NULL)//空链表
{
return;
}
while ((i < pos) && (cur->next != NULL))
{
previous= cur;
cur = cur->next;
i++;
}
if (i < pos)//表示从(cur->next != NULL)的条件退出,说明节点个数小于pos
return;
if (previous == NULL)//删除第一个节点
{
*pplist = cur->next;
free(cur);
}
else //删除普通节点
{
previous->next = cur->next;
free(cur);
}
}
void Remove(pList* pplist, DataType d)//删除指定元素
{
Node* cur = *pplist;
Node* previous = NULL;
if (cur == NULL)//空链表
return;
if ((*pplist)->data == d)//删除元素为头结点
{
*pplist = (*pplist)->next;//链表重置后的新的头结点
return;
}
while (cur != NULL)
{
if (cur->data == d)
{
previous->next = cur->next;
cur = cur->next;
free(cur);
cur =NULL;
return;
}
else
{
previous = cur;
cur = cur->next;
}
}
}
void RemoveAll(pList* pplist, DataType d)//删除指定所有元素
{
Node* cur = *pplist;
Node* tmp = NULL;
if (cur == NULL)//空链表
return;
while (cur!= NULL)
{
if ((*pplist)->data == d)//删除元素为头结点
{
*pplist = (*pplist)->next;
cur = *pplist;
continue;
}
if (cur->data == d)
{
cur = cur->next;
free(tmp->next);
tmp->next=cur;
continue;
}
tmp = cur;
cur = cur->next;
}
}
test.c
#ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> typedef int DataType; typedef struct Node { DataType data; struct Node *next; }Node, *pNode,*pList; void InitLinkLinst(pList* pplist);//初始化链表 void DestroyList(pList* pplist);//销毁 void PushBack(pList* pplist, DataType d);//尾插 void PopBack(pList* pplist);//尾删 void Display(const pList pplist);//打印 void PushFront(pList* pplist, DataType d);//头插 void PopFront(pList* pplist);//头删 pNode Find(pList* pplist, DataType d);//查找 void Insert(pList* pplist, DataType d, int pos);//指定位置插入 void Erase(pList* pplist, int pos);//删除指定位置 void Remove(pList* pplist, DataType d);//删除指定元素 void RemoveAll(pList* pplist, DataType d);//删除指定所有元素 #endif //__LINKLIST_H__
LinkList.c
#include "LinkList.h"
void InitLinkLinst(pList *pplist)//初始化
{
*pplist = NULL;
}
void PushBack(pList* pplist, DataType d)//尾插
{
Node* cur = *pplist;
Node *p = malloc(sizeof(Node));//动态开辟一块空间存放插入元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
if (cur == NULL)//空链表
{
*pplist = p;
}
else //非空链表
{
while (cur->next != NULL)
{
cur = cur->next;//找到尾部
}
cur->next = p;
}
}
//void Display(pList* pplist)//循环打印
//{
// Node* cur = pplist;
//
// for (; cur != NULL; cur = cur->next)
// {
// printf("%d ",cur->data);
// }
// printf("\n");
//}
void Display(const pList pplist)//递归打印
{
if (pplist == NULL)
{
printf("\n");
}
else
{
printf("%d-->", pplist->data);
Display(pplist->next);
}
}
void PopBack(pList* pplist)//尾删
{
Node* cur = *pplist;
Node* previous = NULL;//用来记录要删除的前一个位置
if (cur == NULL)//空链表
{
return;
}
while (cur->next != NULL)
{
previous = cur;
cur = cur->next;
}
if (previous != NULL)//多于一个节点
{
previous->next = NULL;
free(cur);
}
else//只有一个节点
{
free(cur);
*pplist = NULL;
}
}
void PushFront(pList* pplist, DataType d)//头插
{
Node* cur = *pplist;
Node *p = malloc(sizeof(Node));//动态开辟一块内存用来存放插入的元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
p->next = *pplist;//将插入元素的next指针指向原链表的头结点
*pplist = p;//链表重置后的新的头结点
}
void PopFront(pList* pplist)//头删
{
Node* cur = *pplist;
if (cur == NULL)//空链表
{
return;
}
else //非空链表
{
*pplist = cur->next;//链表重置后的新的头结点
free(cur);
}
}
pNode Find(pList* pplist, DataType d)//查找元素,若找到了返回位置,没找到返回空指针
{
Node* cur = *pplist;
while (cur != NULL)
{
if (cur->data == d)
{
return cur;
}
else
{
cur = cur->next;
}
}
return NULL;
}
void Insert(pList* pplist, DataType d, int pos)//指定位置插入
{
int i = 0;
Node* cur = *pplist;
Node* previous = NULL;
Node *p = malloc(sizeof(Node));//动态开辟一块内存用来存放插入的元素
memset(p, 0, sizeof(Node));
p->data = d;
p->next = NULL;
if (cur == NULL)//空链表
{
*pplist = p;//链表重置后的新的头结点
return;
}
for (i = 0; (i < pos)&&(cur->next != NULL); i++)//找到指定位置
{
previous = cur;
cur = cur->next;
}
if (previous == NULL)//在最前边插入
{
p->next = cur;
*pplist = p;
}
else
{
p->next = cur;
previous->next = p;
}
}
void Erase(pList* pplist, int pos)//删除指定位置
{
int i = 0;
Node* cur = *pplist;
Node* previous = NULL;
if (cur == NULL)//空链表
{
return;
}
while ((i < pos) && (cur->next != NULL))
{
previous= cur;
cur = cur->next;
i++;
}
if (i < pos)//表示从(cur->next != NULL)的条件退出,说明节点个数小于pos
return;
if (previous == NULL)//删除第一个节点
{
*pplist = cur->next;
free(cur);
}
else //删除普通节点
{
previous->next = cur->next;
free(cur);
}
}
void Remove(pList* pplist, DataType d)//删除指定元素
{
Node* cur = *pplist;
Node* previous = NULL;
if (cur == NULL)//空链表
return;
if ((*pplist)->data == d)//删除元素为头结点
{
*pplist = (*pplist)->next;//链表重置后的新的头结点
return;
}
while (cur != NULL)
{
if (cur->data == d)
{
previous->next = cur->next;
cur = cur->next;
free(cur);
cur =NULL;
return;
}
else
{
previous = cur;
cur = cur->next;
}
}
}
void RemoveAll(pList* pplist, DataType d)//删除指定所有元素
{
Node* cur = *pplist;
Node* tmp = NULL;
if (cur == NULL)//空链表
return;
while (cur!= NULL)
{
if ((*pplist)->data == d)//删除元素为头结点
{
*pplist = (*pplist)->next;
cur = *pplist;
continue;
}
if (cur->data == d)
{
cur = cur->next;
free(tmp->next);
tmp->next=cur;
continue;
}
tmp = cur;
cur = cur->next;
}
}
test.c
#include "LinkList.h" test() { Node *head = NULL; InitLinkLinst(&head);//初始化 PushBack(&head, 1);//尾插1,2,3 PushBack(&head, 2); PushBack(&head, 3); Display(head);//打印 PopBack(&head);//尾删3 Display(head);//打印 PushFront(&head, 2);//头插2 Display(head);//打印 PopFront(&head);//头删2 Display(head);//打印 Insert(&head, 5, 1);//将5插入第1个位置 Display(head);//打印 Erase(&head, 0);//删除第0个节点 Display(head);//打印 PushBack(&head, 1);//尾插1,2,3 PushBack(&head, 2); PushBack(&head, 5); Remove(&head, 5);//删除指定元素 Display(head);//打印 RemoveAll(&head, 2); Display(head);//打印 int *p = (int *)Find(&head, 2);//查找 int c = 0; if (p == NULL) { printf("没有找到\n"); } else { printf("找到了\n"); } } } int main() { test(); system("pause:"); return 0; }
相关文章推荐
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 链表的全部操作——创建、插入、查找、删除、计算长度
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 简单顺序表的插入,删除,指定位置,指定元素的插入删除操作
- js数组插入指定位置元素,删除指定位置元素,查找指定位置元素算法
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- 链表基本操作(删除,插入,查找)
- 线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表
- 链表的基本操作(C语言版):建立,插入,删除,查找,输出
- 单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并
- 单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
- 单链表的基本操作(查找,插入,删除)
- 链表基本操作(创建,插入,查找,删除)-C语言
- 单链表基本操作的实现--创建、插入、查找、删除
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 链表(单双链表)用法与基本操作(构建、查找、插入、删除)实现
- JS 字符串操作函数 往指定位置插入字符 删除指定位置字符 替换指定位置字符
- CPtrList操作--插入,删除特定元素,删除全部