作业
题目
- 单链表按位置修改
- 单链表按元素删除
- 单链表按元素修改
- 单链表空间释放
结果
代码
main
#include "head.h"
int main(int argc, char const *argv[])
{
// 创建单链表
PLinkedList list = list_create();
// 尾插
for (int i = 0; i < 5; i++){
list_insert_rear(list,(DataType)(i+1)*3);
}
// 头插
for (int i = 0; i < 5; i++){
list_insert_head(list,(DataType)(i+1)*4);
}
printf("初始单链表\n");
list_to_string(list);
/********************************
* 作业1:单链表按位置修改
*********************************/
printf("位置3的元素修改为333\n");
DataType elem = 333;
list_modify_index(list,3,elem);
list_to_string(list);
/********************************
* 作业2:单链表按元素删除
*********************************/
printf("删除元素15\n");
elem = 15;
list_delete_elem(list,elem);
list_to_string(list);
/********************************
* 作业3:单链表按元素修改
*********************************/
printf("修改元素16为666\n");
list_modify_elem(list,16,666);
list_to_string(list);
/********************************
* 作业4:单链表释放
*********************************/
list = list_free(list);
printf("单链表释放后\n");
list_to_string(list);
return 0;
}
head.h
#if !defined(_HEAD_H_)
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node{
union {
//数据域
DataType data;
int len;
};
//指针域
struct Node *next;
}*PLinkedList, *PNode, Node;
// 创建单链表
PLinkedList list_create();
// 创建节点
PNode list_create_node();
// 尾插
int list_insert_rear(PLinkedList l,DataType e);
// 头插
int list_insert_head(PLinkedList l,DataType e);
// 遍历
int list_to_string(PLinkedList l);
// 按位置修改
int list_modify_index(PLinkedList l,int pos,DataType e);
// 按位置删除
int list_delete_index(PLinkedList l,int pos);
// 按元素查找
int list_search_elem(PLinkedList l,DataType e);
// 按元素删除
int list_delete_elem(PLinkedList l,DataType e);
// 按元素修改
int list_modify_elem(PLinkedList l,DataType e,DataType val);
// 尾删
int list_delete_rear(PLinkedList l);
// 空间释放
PLinkedList list_free(PLinkedList l);
#endif // _HEAD_H_
func.c
#include "head.h"
/*
* 创建节点
* @return 成功节点 失败NULL
*/
PNode list_create_node(){
PNode node = (PNode)malloc(sizeof(Node));
if(!node){
return NULL;
}
return node;
}
/*
* 创建单链表
* @return 成功头节点 失败NULL
*/
PLinkedList list_create(){
PNode l = list_create_node();
if (!l){
return NULL;
}
l->len = 0;
l->next = NULL;
return l;
}
/*
* 尾插
* @param l 单链表
* @param e 要插入的元素
* @return 成功0 失败-1
*/
int list_insert_rear(PLinkedList l,DataType e){
// 判头节点存在
if(!l){
return -1;
}
// 创建节点
PNode node = list_create_node();
if(!node){
return -1;
}
node->data = e;
node->next = NULL;
// 移动到最后一个节点,连接节点
PLinkedList p=l;
while(p->next){
p = p->next;
}
p->next = node;
l->len++;
}
/*
* 头插
* @param l 单链表
* @param e 要插入的元素
* @return 成功0 失败-1
*/
int list_insert_head(PLinkedList l,DataType e){
// 判头节点存在
if(!l){
return -1;
}
// 创建节点
PNode node = list_create_node();
if(!node){
return -1;
}
node->data = e;
node->next = l->next;
// 连接节点
l->next = node;
l->len++;
}
/*
* 遍历
* @param l 单链表
* @return 成功0 失败-1
*/
int list_to_string(PLinkedList l){
// 判头节点
if(!l){
return -1;
}
// 遍历
while (l->next){
l = l->next;
printf("%d ",l->data);
}
putchar('\n');
return 0;
}
int list_modify_index(PLinkedList l,int pos,DataType e){
// 判头节点、判空
if(!l || !l->next){
return -1;
}
// 判下标合法
if (pos < 0 || pos > l->len + 1){
return -1;
}
// 移动到目标节点
PNode target = l;
for (int i = 0; i < pos; i++){//0 头节点
target = target->next;
}
// 修改数据
target->data = e;
return 0;
}
/*
* 按元素查询
* @param l 单链表
* @param e 要查询的元素
* @return 成功 元素下标 失败-1
*/
int list_search_elem(PLinkedList l,DataType e){
// //判头节点、判空
if(!l || !l->next){
return -1;
}
// //遍历返回下标
int index = 0;
while (l->next){
l = l->next;
index++;
if(l->data == e){
return index;
}
}
return -1;
}
/*
* 按位置删除
* @param l 单链表
* @param pos 要删除的元素的下标
* @return 成功0 失败-1
*/
int list_delete_index(PLinkedList l,int pos){
//判头节点、判空
if(!l || !l->next){
return -1;
}
// // 判下标合法
if (pos < 0 || pos > l->len){
return -1;
}
// 获取要删除的节点
PNode pre_targe = l;
for (int i = 0; i < pos-1; i++){
pre_targe = pre_targe->next;
}
PNode targe = pre_targe->next;
// 删除
pre_targe->next = targe->next;
free(targe);
targe = NULL;
return 0;
}
/*
* 按元素删除
* @param l 单链表
* @param e 要删除的元素
* @return 成功0 失败-1
*/
int list_delete_elem(PLinkedList l,DataType e){
//判头节点、判空
// if(!l || !l->next){
// return -1;
// }
// 获取元素下标
int index = list_search_elem(l,e);
// 按下标删除
list_delete_index(l,index);
return 0;
}
int list_modify_elem(PLinkedList l,DataType e,DataType val){
//判头节点、判空
if(!l || !l->next){
return -1;
}
//获取元素下标
int index = list_search_elem(l,e);
// 按下标修改元素
list_modify_index(l,index,val);
return 0;
}
/*
* 尾删
* @param l 单链表
* @return 成功0 失败-1
*/
int list_delete_rear(PLinkedList l){
//判空、判头节点
if(!l || !l->next){
return -1;
}
//移动到倒数第二个节点
PNode pre_end = l;
while (pre_end->next->next){
pre_end = pre_end->next;
}
//删除最后一个节点
free(pre_end->next);
pre_end->next = NULL;
return 0;
}
/*
* 空间释放
* @param l 单链表
* @return NULL
*/
PLinkedList list_free(PLinkedList l){
// 判断头节点、判空
if(!l || !l->next){
return NULL;
}
// 删除全部节点
for (int i = 1; i < l->len; i++){
list_delete_rear(l);
}
// 释放头节点
free(l);
return NULL;
}