Linlist.h:
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct Node
{
union
{
datatype data;
int len;
};
struct Node *next;
}Linklist;
//创建
Linklist* listCreat();
//申请节点
Linklist* nodeBuy(datatype e);
//判空
int listEmpty(Linklist *L);
//头插
int listInsertHead(Linklist *L,datatype e);
//遍历
void listShow(Linklist *L);
//尾插
int listInsertTail(Linklist *L,datatype e);
//按位置查找返回找到的节点
Linklist* findNode(Linklist *L,int pos);
//任意位置插入
int listInsertPos(Linklist *L,int pos,datatype e);
//头删
int listDeleteHead(Linklist*L);
//尾删
int listDeleteTail(Linklist*L);
//任意删
int listDeletePos(Linklist *L,int pos);
//按值查找
int listSearchValue(Linklist *L,datatype e);
//按位置修改
int listUpdatePos(Linklist *L,int pos,datatype e);
//按值修改
int listUpdateValue(Linklist *L,datatype old_e,datatype new_e);
//链表反转
void listReverse(Linklist*L);
//销毁链表
void listFree(Linklist *L);
#endif
Linklist.c:
#include "linklist.h"
//创建---------------------------------------------------------------
Linklist *listCreat()
{
Linklist *L = (Linklist *)malloc(sizeof(Linklist));
if(NULL == L)
{
printf("链表创建失败\n");
return NULL;
}
L->len = 0;
L->next = NULL;
printf("链表创建成功\n");
return L;
}
//申请节点------------------------------------------------------------
Linklist *nodeBuy(datatype e)
{
Linklist *p =(Linklist *)malloc(sizeof(Linklist));
if(NULL == p)
{
printf("节点申请失败\n");
return NULL;
}
p->data = e;
p->next = NULL;
}
//判空-----------------------------------------------------------------
int listEmpty(Linklist *L)
{
return L->next == NULL? 1: 0;
}
//头插-----------------------------------------------------------------
int listInsertHead(Linklist *L,datatype e)
{
//判断条件
if(NULL == L)
{
printf("所给链表不合法\n");
return -1;
}
//申请节点
Linklist *p = (Linklist *)malloc(sizeof(Linklist));
if(NULL == p)
{
printf("节点申请失败\n");
return -1;
}
//数据放入节点
p->data = e;
p->next = NULL;
//完成头插
p->next = L->next;
L->next = p;
//表的变化
L->len ++;
printf("头插%c成功\n",e);
}
//遍历-----------------------------------------------------------
void listShow(Linklist *L)
{
//判断逻辑
if(NULL == L ||listEmpty(L) )
{
printf("遍历失败\n");
return;
}
//遍历逻辑
printf("链表元素分别是:");
Linklist *q = L->next;
while(q != NULL)
{
printf("%c\t",q->data);
q = q->next;
}
printf("\n");
}
//尾插---------------------------------------------------------------------------
int listInsertTail(Linklist *L,datatype e)
{
if(NULL == L)
{
printf("所给链表不合法\n");
}
Linklist *p =nodeBuy(e);
Linklist *q = L;
while(q->next != NULL)
{
q = q->next;
}
q->next = p;
L->len++;
printf("%c尾插完成\n",e);
}
//按位置查找返回找到的节点------------------------------------------------------
Linklist *findNode(Linklist *L,int pos)
{
if(NULL == L || pos < 0 || pos > L->len)
{
printf("查找失败\n");
return NULL;
}
Linklist *q = L;
for(int i = 1;i <= pos;i++)
{
q = q->next;
}
return q;
}
//任意位置插入-------------------------------------------------------
int listInsertPos(Linklist *L,int pos,datatype e)
{
if(NULL == L || pos < 1 || pos > L->len + 1)
{
printf("插入失败\n");
return -1;
}
Linklist *p = nodeBuy(e);
Linklist *q = findNode(L,pos-1);
p->next = q->next;
q->next = p;
L->len++;
printf("%d位置插入%c成功\n",pos,e);
return 0;
}
//头删------------------------------------------------------------
int listDeleteHead(Linklist*L)
{
if(NULL == L || listEmpty(L))
{
printf("删除失败\n");
return -1;
}
Linklist *p = L->next;
L->next = p->next;
free(p);
p = NULL;
L->len--;
printf("头删成功\n");
return 0;
}
///尾删--------------------------------------------------------
int listDeleteTail(Linklist*L)
{
if(NULL == L || listEmpty(L))
{
printf("尾删失败\n");
return -1;
}
Linklist *p = L;
Linklist *q = NULL;
while(p->next != NULL)
{
q = p;
p = p->next;
}
q->next=NULL;
free(p);
p = NULL;
L->len--;
printf("尾删除成功\n");
return 0;
}
//按位置修改-------------------------------------------------
int listUpdatePos(Linklist *L,int pos,datatype e)
{
if(NULL == L || pos < 0 || pos > L->len)
{
printf("修改失败\n");
}
Linklist *p=L;
for(int i = 0;i < pos;i++)
{
p = p->next;
}
p->data = e;
printf("%d位置的成功修改为%c\n",pos,e);
}
//按值修改------------------------------------------------------
int listUpdateValue(Linklist *L,datatype old_e,datatype new_e)
{
if(NULL == L || listEmpty)
{
}
Linklist *p = L->next;
for(int i = 1;i > L->len;i++)
{
if(p->data == old_e)
{
p->data = new_e;
}
p = p->next;
}
printf("修改成功\n");
}
//任意删------------------------------------------------------------
int listDeletePos(Linklist *L,int pos)
{
if(NULL == L ||listEmpty(L)|| pos < 1 || pos > L->len )
{
printf("删除失败\n");
return -1;
}
Linklist* q = findNode(L,pos-1);
Linklist* p = q->next;
q->next = p->next;
free(p);
p = NULL;
L->len--;
printf("%d位置删除成功\n",pos);
}
//按值查找----------------------------------------------------------
int listSearchValue(Linklist *L,datatype e)
{
if(NULL == L || listEmpty(L))
{
printf("查找失败\n");
return -1;
}
Linklist *q = L->next;
for(int i = 1;i < L->len;i++)
{
if(q->data == e)
{
return i;
}
q = q->next;
}
return 0;
}
//销毁链表-------------------------------------------------------------
void listFree(Linklist *L)
{
if(NULL == L)
{
return;
}
while(L->next != NULL)
{
listDeleteHead(L);
}
free(L);
L = NULL;
printf("销毁链表成功\n");
return;
}
//链表反转-------------------------------------------------------------
void listReverse(Linklist*L)
{
if(NULL == L || listEmpty(L))
{
printf("反转失败\n");
return;
}
Linklist *p1 = L->next;
Linklist *p2 = L->next->next;
Linklist *p3 = NULL;
while(p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
L->next->next = NULL;
L->next = p1;
}
main.c:
#include "linklist.h"
int main(int argc, const char *argv[])
{
//调用创建函数
printf("------------创建函数---------------\n");
Linklist *L = listCreat();
if(NULL == L)
{
return -1;
}
//调用头插函数
printf("------------头插函数---------------\n");
listInsertHead(L,'Q');
listInsertHead(L,'W');
listInsertHead(L,'E');
listInsertHead(L,'R');
listInsertHead(L,'T');
listInsertHead(L,'Y');
listInsertHead(L,'U');
listInsertHead(L,'I');
listShow(L);
//调用遍历函数
printf("------------遍历函数---------------\n");
listShow(L);
//调用尾插函数
printf("------------尾插函数---------------\n");
listInsertTail(L,'K');
listShow(L);
//按位置查找返回找到的节点
printf("------------查找函数---------------\n");
findNode(L,3);
//任意位置插入
printf("------------插入函数---------------\n");
listInsertPos(L,6,'E');
listShow(L);
//头删
printf("------------头删函数---------------\n");
listDeleteHead(L);
listShow(L);
//尾删
printf("------------尾删函数---------------\n");
listDeleteTail(L);
listShow(L);
//任意删
printf("------------删除函数---------------\n");
listDeletePos(L,3);
listShow(L);
//按值查找
printf("------------按值查找---------------\n");
int res = listSearchValue(L,'W');
if(res == -1)
{
printf("查找失败\n");
}else if (res == 0)
{
printf("没找到\n");
}else if(res > 0)
{
printf("查找成功,在%d个位置\n",res);
}
//按位置修改
printf("-----------按位置修改--------------\n");
listUpdatePos(L,3,'W');
listShow(L);
//按值修改
printf("------------按值修改---------------\n");
listUpdateValue(L,'W','A');
listShow(L);
//反转链表
printf("------------反转链表---------------\n");
listReverse(L);
listShow(L);
//销毁链表
printf("------------销毁链表---------------\n");
listFree(L);
L = NULL;
listShow(L);
return 0;
}
测试展示:
------------创建函数---------------
链表创建成功
------------头插函数---------------
头插Q成功
头插W成功
头插E成功
头插R成功
头插T成功
头插Y成功
头插U成功
头插I成功
链表元素分别是:I U Y T R E W Q
------------遍历函数---------------
链表元素分别是:I U Y T R E W Q
------------尾插函数---------------
K尾插完成
链表元素分别是:I U Y T R E W Q K
------------查找函数---------------
------------插入函数---------------
6位置插入E成功
链表元素分别是:I U Y T R E E W Q K
------------头删函数---------------
头删成功
链表元素分别是:U Y T R E E W Q K
------------尾删函数---------------
尾删除成功
链表元素分别是:U Y T R E E W Q
------------删除函数---------------
3位置删除成功
链表元素分别是:U Y R E E W Q
------------按值查找---------------
查找成功,在6个位置
-----------按位置修改--------------
3位置的成功修改为W
链表元素分别是:U Y W E E W Q
------------按值修改---------------
修改成功
链表元素分别是:U Y W E E W Q
------------反转链表---------------
链表元素分别是:Q W E E W Y U
------------销毁链表---------------
头删成功
头删成功
头删成功
头删成功
头删成功
头删成功
头删成功
销毁链表成功
遍历失败