单链表基本操作实现——详解
2018-03-29 20:40
429 查看
单链表是数据结构中十分常见,许多互联网公司笔试面试题好多都是单链表延伸出的,因此实能现一个单链表的基本操作很有必要,而且能让它不出现Bug还需要更细心。
基本功能:
1.添加元素 2.头插元素
3.尾插元素 4.头删元素
5.尾删元素 6.销毁链表
7.删除指定元素 8.指定位置插入元素
代码如下:#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef int DataType;
typedef struct Slist
{
struct Slist *next;
DataType data;
}Slist;
Slist List;
Slist *BuySlist(DataType x) //添加元素
{
Slist *node = (Slist *)malloc(sizeof(Slist));
assert(node);
node->data = x;
node->next = NULL;
return node;
}
void ListPushback(Slist **head, DataType x) //尾插元素
{
if (*head == NULL) //没有元素的情况
{
*head = BuySlist(x);
}
else
{
Slist *cur = *head;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = BuySlist(x);
}
}
void ListPopBack(Slist **head) //尾删元素
{
if (*head == NULL) //没有元素
{
return;
}
else if ((*head)->next == NULL) //只有一个元素
{
free(*head);
*head = NULL; //防止内存泄漏
}
Slist *cur = *head;
Slist *pos = cur;
while (cur->next != NULL)
{
pos = cur; //上下位置不能变
cur = cur->next;
}
free(cur);
cur = NULL;
pos->next = NULL; //此时pos为尾结点
}
void ListPushFront(Slist **head, DataType x) //头插元素
{
if (*head == NULL) //没有结点
{
*head = BuySlist(x);
return;
}
Slist *new;
new = BuySlist(x);
new->next = *head;
*head = new;
}
void ListPopFront(Slist **head)//头删元素
{
if (*head==NULL)
{
return;
}
//else if ((*head)->next == NULL)//一个节点 //注意这里不能写成*head->next,这是错的,存在优先级问题
//{
// free(*head);
// *head = NULL;
//}
Slist *cur = (*head)->next;
free(*head);
*head = cur;
}
void ListDestory(Slist **head) //销毁单链表
{
Slist *cur = *head;
while (cur)
{
Slist *next = cur->next;
free(cur);
cur = next;
}
*head = NULL;
}
Slist *Find(Slist *head, DataType x) //查找指定元素,返回下标
{
Slist *cur = head;
while (cur!=NULL)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void ListErase(Slist **head, Slist *pos) //删除任意节点
{
assert(pos&&*head);
if ((*head) == pos) //删除头节点
{
ListPopFront(head);
}
else if (pos->next == NULL) //删除尾节点
{
ListPopBack(head);
}
else
{
Slist *prev = *head;
while (prev->next != pos)
{
prev = prev->next;
}
prev = pos->next;
free(pos);
}
}
void Insert(Slist **head, Slist *pos, DataType x) //插入元素
{
assert(*head&&pos);
Slist *cur = *head;
Slist *tmp=NULL;
while (cur->next!=pos)
{
cur=cur->next;
}
/*tmp->data = x;
tmp->next = pos;*/
tmp = BuySlist(x);
tmp->next = pos;
cur->next = tmp;
}
void print(Slist *head) //打印元素
{
Slist *cur = head;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL");
printf("\n");
}
void test1(Slist *list)
{
list = NULL;
ListPushback(&list, 1); //不能传list,实际上传的是地址的值,要传二级指针
ListPushback(&list, 7);
ListPushback(&list, 4);
ListPushback(&list, 15);
ListPushFront(&list, 10);
Slist *pos = Find(list, 7);
Insert(&list, pos, 2);
//ListPopFront(&list);
//ListPopBack(&list);
print(list);
}
int main()
{
test1(&List);
system("pause");
return 0;
}test函数根据自己的使用情况来调用任意函数
基本功能:
1.添加元素 2.头插元素
3.尾插元素 4.头删元素
5.尾删元素 6.销毁链表
7.删除指定元素 8.指定位置插入元素
代码如下:#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef int DataType;
typedef struct Slist
{
struct Slist *next;
DataType data;
}Slist;
Slist List;
Slist *BuySlist(DataType x) //添加元素
{
Slist *node = (Slist *)malloc(sizeof(Slist));
assert(node);
node->data = x;
node->next = NULL;
return node;
}
void ListPushback(Slist **head, DataType x) //尾插元素
{
if (*head == NULL) //没有元素的情况
{
*head = BuySlist(x);
}
else
{
Slist *cur = *head;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = BuySlist(x);
}
}
void ListPopBack(Slist **head) //尾删元素
{
if (*head == NULL) //没有元素
{
return;
}
else if ((*head)->next == NULL) //只有一个元素
{
free(*head);
*head = NULL; //防止内存泄漏
}
Slist *cur = *head;
Slist *pos = cur;
while (cur->next != NULL)
{
pos = cur; //上下位置不能变
cur = cur->next;
}
free(cur);
cur = NULL;
pos->next = NULL; //此时pos为尾结点
}
void ListPushFront(Slist **head, DataType x) //头插元素
{
if (*head == NULL) //没有结点
{
*head = BuySlist(x);
return;
}
Slist *new;
new = BuySlist(x);
new->next = *head;
*head = new;
}
void ListPopFront(Slist **head)//头删元素
{
if (*head==NULL)
{
return;
}
//else if ((*head)->next == NULL)//一个节点 //注意这里不能写成*head->next,这是错的,存在优先级问题
//{
// free(*head);
// *head = NULL;
//}
Slist *cur = (*head)->next;
free(*head);
*head = cur;
}
void ListDestory(Slist **head) //销毁单链表
{
Slist *cur = *head;
while (cur)
{
Slist *next = cur->next;
free(cur);
cur = next;
}
*head = NULL;
}
Slist *Find(Slist *head, DataType x) //查找指定元素,返回下标
{
Slist *cur = head;
while (cur!=NULL)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void ListErase(Slist **head, Slist *pos) //删除任意节点
{
assert(pos&&*head);
if ((*head) == pos) //删除头节点
{
ListPopFront(head);
}
else if (pos->next == NULL) //删除尾节点
{
ListPopBack(head);
}
else
{
Slist *prev = *head;
while (prev->next != pos)
{
prev = prev->next;
}
prev = pos->next;
free(pos);
}
}
void Insert(Slist **head, Slist *pos, DataType x) //插入元素
{
assert(*head&&pos);
Slist *cur = *head;
Slist *tmp=NULL;
while (cur->next!=pos)
{
cur=cur->next;
}
/*tmp->data = x;
tmp->next = pos;*/
tmp = BuySlist(x);
tmp->next = pos;
cur->next = tmp;
}
void print(Slist *head) //打印元素
{
Slist *cur = head;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL");
printf("\n");
}
void test1(Slist *list)
{
list = NULL;
ListPushback(&list, 1); //不能传list,实际上传的是地址的值,要传二级指针
ListPushback(&list, 7);
ListPushback(&list, 4);
ListPushback(&list, 15);
ListPushFront(&list, 10);
Slist *pos = Find(list, 7);
Insert(&list, pos, 2);
//ListPopFront(&list);
//ListPopBack(&list);
print(list);
}
int main()
{
test1(&List);
system("pause");
return 0;
}test函数根据自己的使用情况来调用任意函数
相关文章推荐
- 详细的单链表基本操作C/C++实现
- C语言实现双向链表的基本操作
- 链表的基本操作实现
- 单链表基本操作的简单实现
- C实现单链表的基本操作笔记
- C++ 实现链表的基本操作之一:链表插入
- 链表上的基本操作实现
- 链表基本操作的程序实现(转)
- 单链表的基本操作与实现
- 链表(单双链表)用法与基本操作(构建、查找、插入、删除)实现
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- 单链表基本操作c语实现
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- [C++]数据结构:有序链表SortedChain的基本实现与操作
- 链表基本操作的实现
- 单链表 基本操作 的实现源码
- c++实现链表的基本操作
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 带头结点的链表实现线性表的基本操作