作业:单链表实现增删查改,以及链表数据的翻转
实现效果功能函数代码:
#include<stdio.h>
#include"listlink.h"
#include"stdlib.h"
//创建表
listlink *list_create()
{
//申请一个头结点
listlink *L=(listlink *)malloc(sizeof(listlink));
if(NULL==L)
{
printf("申请失败\n");
return NULL;
}
//结点初始化
L->len=0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//判空
int list_empty(listlink *L)
{
return L->next==NULL?1:0;
}
//遍历
void list_show(listlink *L)
{
//判断逻辑
if(NULL==L||list_empty(L))
{
printf("链表不合法或为空\n");
return;
}
//定义指针指向第一个结点开始遍历
printf("此时链表内的数据有>>>");
listlink *q=L->next;
while(q!=NULL)
{
printf("%-4c",q->data);
q=q->next;
}
printf("\n");
}
//申请数据封装结点
listlink *list_buy_node(datatype e)
{
//申请一个结点
listlink *p=(listlink *)malloc(sizeof(listlink));
if(NULL==p)
{
printf("申请失败\n");
return NULL;
}
//申请成功,返回结点
p->data=e;
p->next=NULL;
return p;
}
//按位置查找返回结点
listlink *list_search_pos(listlink *L,int pos)
{
//判断逻辑
if(NULL==L||pos<0||pos>L->len)
{
printf("查找失败\n");
return NULL;
}
//定义指针指向头结点开始遍历
listlink *q=L;
for(int i=0;i<pos;i++)
{
q=q->next; //依次向后
}
//返回结点
return q;
}
//任意位置添加数据
int list_insert_pos(listlink *L,int pos,datatype e)
{
//判断逻辑
if(NULL==L||pos<1||pos>L->len+1)
{
printf("添加失败\n");
return 0;
}
//添加逻辑
//申请结点数据封装
listlink *p=list_buy_node(e);
//找到对应位置结点前驱结点
listlink *q=list_search_pos(L,pos-1);
//进行插入操作
p->next=q->next;
q->next=p;
//表长变化
L->len++;
printf("插入成功\n");
return 1;
}
//任意位置删除数据
int list_delete_pos(listlink *L,int pos)
{
//判断逻辑
if(NULL==L||list_empty(L)||pos<1||pos>L->len)
{
printf("删除失败\n");
return 0;
}
//找到删除位置对应前驱结点
listlink *q=list_search_pos(L,pos-1);
//删除操作
//标记要删除的结点
listlink *p=q->next;
//孤立删除结点
q->next=p->next;
//释放结点
free(p);
p==NULL;
printf("删除成功\n");
L->len--;
return 1;
}
//按位置修改数据
int list_updat_pos(listlink *L,int pos,datatype new_e)
{
//判断逻辑
if(NULL==L||pos<0||pos>L->len)
{
printf("修改失败\n");
return 0;
}
//定义指针指向第一个结点开始遍历
listlink *q=L->next;
for(int i=1;i<pos;i++)
{
q=q->next; //依次向后
}
//修改新值
q->data=new_e;
printf("修改成功\n");
return 1;
}
//链表数据翻转
void list_severse(listlink *L)
{
//判断逻辑
if(NULL==L||list_empty(L))
{
printf("翻转失败\n");
return;
}
//翻转操作
//定义一个指针指向第一个结点,替换头结点
listlink *q=L->next;
//独立头结点
L->next=NULL;
//再定义一个指针存放被独立结点
listlink *p;
while(q!=NULL) //循环依次释放第一个结点
{
p=q; //接受当前的第一个结点
q=q->next; //依次向后移
//将独立出来的结点对头结点进行头插操作
p->next=L->next;
L->next=p;
}
printf("翻转成功\n");
}
//链表销毁
void list_free(listlink *L)
{
//定义指针指向头结点开始遍历
listlink *q=L;
while(q->next!=NULL)
{
list_delete_pos(L,1); //依次删除
}
printf("销毁成功\n");
free(q);
q=NULL;
}
函数声明代码:
#ifndef __LISTLINK_H__
#define __LISTLINK_H__
typedef char datatype; //类型重定义
typedef struct node
{
union
{
int len;//头结点数据域
datatype data;//普通节点数据域
};
struct node *next;
}listlink;
//创建表
listlink *list_create();
//判空
int list_empty(listlink *L);
//遍历
void list_show(listlink *L);
//申请数据封装结点
listlink *list_buy_node(datatype e);
//头插
int list_insert_head(listlink *L,datatype e);
//任意位置添加数据
int list_insert_pos(listlink *L,int pos,datatype e);
//任意位置删除数据
int list_delete_pos(listlink *L,int pos);
//按位置查找数据返回结点
listlink *list_search_pos(listlink *L,int pos);
//按位置修改数据
int list_updat_pos(listlink *L,int pos,datatype new_e);
//按值修改数据
int list_updat_value(listlink *L,datatype e,datatype new_e);
//链表数据翻转
void list_severse(listlink *L);
//链表销毁
void list_free(listlink *L);
#endif
主函数进行函数调用:
#include<stdio.h>
#include"listlink.h"
int main(int argc, const char *argv[])
{
//创建表
listlink *L=list_create();
if(NULL==L)
{
printf("创建失败\n");
return -1;
}
//调用添加函数
list_insert_pos(L,1,'a');
list_insert_pos(L,2,'b');
list_insert_pos(L,3,'c');
list_insert_pos(L,4,'d');
list_insert_pos(L,5,'e');
list_insert_pos(L,6,'f');
list_insert_pos(L,7,'g');
list_insert_pos(L,8,'h');
list_insert_pos(L,9,'i');
//调用遍历函数
list_show(L);
//调用删除函数
list_delete_pos(L,1);
list_show(L);
//调用修改函数
list_updat_pos(L,1,'B');
list_updat_pos(L,2,'C');
list_show(L);
//调用翻转函数
list_severse(L);
list_show(L);
//销毁链表
list_free(L);
L=NULL;
list_show(L);
return 0;
}
实现效果: