C语言实现单向链表的逆序
linklist.c中定义的单向链表相关操作的函数,大多实现逆序的过程用不到。
结果预览:
linklist.h
/*
linklist.h
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#ifndef __LINKLIST__
#define __LINKLIST__
typedef int data_t;
typedef struct linklist{
data_t data; //数据域
struct linklist *next; //指针域
}Node,LinkList;
//逆序函数
void myfunc(LinkList *head);
//创建节点
LinkList *Create_Linklist();
//打印内容
void Show_Linklist(LinkList *head);
//判空
bool Linklist_Is_Empty(LinkList *head);
//计算表长
int Linklist_Length(LinkList *head);
//头插法
void Linklist_Insert_Head(LinkList *head,data_t data);
//插入 按位置
void Linklist_Insert_Pos(LinkList *head,int pos,data_t data);
//删除 按位置
void Linklist_Delete_Pos(LinkList *head,int pos);
//删除 按数据
void Linklist_Delete_Val(LinkList *head,data_t data);
//查找 按位置 返回数据
data_t Linklist_Search_Pos(LinkList *head,int pos);
//查找 按数据 返回位置
int Linklist_Search_Val(LinkList *head,data_t data);
//修改 按位置
void Linklist_Change_Pos(LinkList *head,int pos,data_t data);
//修改 按数据
void Linklist_Change_Val(LinkList *head,data_t o_data,data_t n_data);
#endif
linklist.c
/*
linklist.c
*/
#include "linklist.h"
//逆序函数
void myfunc(LinkList *head)
{
Node *p = head->next->next;//从第二个结点开始
Node *q = NULL;
head->next->next = NULL;//将第一个结点变为尾结点
while(p != NULL){
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
}
//创建节点
LinkList *Create_Linklist()
{
//创建节点
LinkList *head = (LinkList *)malloc(sizeof(LinkList));
if(head == NULL){
printf("head malloc failed!\n");
return NULL;
}
//节点next指向空
head->next = NULL;
return head;
}
//打印内容
void Show_Linklist(LinkList *head)
{
Node *p = head;
if(p->next == NULL){//判空
printf("Empty!ERROR!\n");
return;
}
while(p->next != NULL){
p = p->next;
printf("%d ",p->data);
}
puts("");
}
//判空
bool Linklist_Is_Empty(LinkList *head)
{
if(head->next == NULL){
return true;//返回 真
}else{
return false;//返回 假
}
}
//计算表长
int Linklist_Length(LinkList *head)
{
Node *p = head;
int count = 0;
while(p->next != NULL){
count++;
p = p->next;
}
return count;
}
//头插法
void Linklist_Insert_Head(LinkList *head,data_t data)
{
Node *new = (Node *)malloc(sizeof(Node));//申请新空间
new->data = data;
new->next = head->next; //新节点 指向 头节点后的节点
head->next = new; //新节点插入头节点后
}
//插入 按位置
void Linklist_Insert_Pos(LinkList *head,int pos,data_t data)
{
if(pos <= 0 || pos > Linklist_Length(head)+1){
printf("Insert pos ERROR!\n");
return;
}
Node *p = head;
Node *new = (Node *)malloc(sizeof(Node));
new->data = data;
int i = 0;
while(++i < pos){//p指向pos前一个位置
p = p->next;
}
new->next = p->next;
p->next = new;
}
//删除 按位置
void Linklist_Delete_Pos(LinkList *head,int pos)
{
if(pos<=0 || pos > Linklist_Length(head))
{
printf("Delete Pos ERROR!\n");
return;
}
Node *p = head;
Node *q = NULL;
int i = 0;
while(++i < pos){//p指向pos前一个位置
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);//释放
}
//删除 按数据
void Linklist_Delete_Val(LinkList *head,data_t data)
{
if(Linklist_Is_Empty(head)){//判断空表
printf("Is Empty List!\n");
return;
}
Node *p = head->next;
int i,j=0;
for(i = 1; i <= Linklist_Length(head); i++){
if(p->data == data){//找到 位置
Linklist_Delete_Pos(head,i);
j = 1;
break;
}else{
p = p->next;
}
}
if(j){
printf("Data is not exist!\n");
return;
}
}
//查找 按位置 返回数据
data_t Linklist_Search_Pos(LinkList *head,int pos)
{
if(pos <= 0 || pos > Linklist_Length(head)){
printf("Search Pos ERROR!\n");
return -1;
}
Node *p = head;
int i = 0;
while(++i <= pos){//p指向查找的位置
p = p->next;
}
return p->data;
}
//查找 按数据 返回位置
int Linklist_Search_Val(LinkList *head,data_t data)
{
if(Linklist_Is_Empty(head)){//判断空表
printf("Link Is Empty!ERROR!\n");
return -1;
}
Node *p = head->next;
int i;
for(i = 1; i <= Linklist_Length(head); i++){
if(p->data == data){
return i;
}else{
p = p->next;
}
}
printf("Data is not exist!ERROR!\n");
return -1;
}
//修改 按位置
void Linklist_Change_Pos(LinkList *head,int pos,data_t data)
{
if(pos <= 0 || pos > Linklist_Length(head)){
printf("Change Pos ERROR!\n");
return;
}
Node *p = head;
int i = 0;
while(++i <= pos){//p指向pos位置
p = p->next;
}
p->data = data;
}
//修改 按数据
void Linklist_Change_Val(LinkList *head,data_t o_data,data_t n_data)
{
if(Linklist_Is_Empty(head)){//判断空表
printf("List Is Empty!ERROR!\n");
return;
}
Node *p = head->next;
int i;
for(i = 1; i <= Linklist_Length(head); i++){
if(p->data == o_data){
p->data = n_data;
return;
}else{
p = p->next;
}
}
printf("Data is not exist!ERROR!\n");
}
main.c
#include "linklist.h"
int main()
{
LinkList *link = Create_Linklist();
//初始赋值
int n = 10;
while(n--){
Linklist_Insert_Head(link,n);
}
//逆序前
printf("Before Sort: ");
Show_Linklist(link);
myfunc(link);//逆序
//逆序后
printf("After Sort: ");
Show_Linklist(link);
return 0;
}