数据结构系统 day4作业 4.20

这篇文章展示了如何使用C语言实现单向链表的各种操作,包括按位置删除节点、按元素删除、按元素修改、在元素前插入新元素以及对链表进行排序。每个操作都包含相应的功能函数和主函数调用示例,提供了清晰的输入输出示例。
摘要由CSDN通过智能技术生成

单向链表按位置修改

//功能函数
int delete_pos(linklist l,int pos)
{
        if(l==NULL||pos<=0||pos>l->len+1)
        {
                printf("删除失败\n");
                return -1;
        }
        linklist p=l;
        for(int i=0;i<pos-1;i++)
        {
                p=p->next;
        }
        linklist q=p->next;
        p->next=q->next;
        free(q);
        q=NULL;
        l->len--;
        return 0;
}
//主函数调用结果
  1 #include "fun.h"
  2 int main(int argc, const char *argv[])
  3 {
  4         linklist l=create_node(1);
  5         int n;
  6         datatype e,key;
  7         printf("请输入插入元素的个数\n");
  8         scanf("%d",&n);
  9         for(int i=0;<n;i++)
 10         {
 11                 printf("请输入插入的值");
 12                 scanf("%d",&e);
 13                 insert_rear(l,e);
 14         }
 15         output_linklist(l);
 16         printf("请输入要删除的位置:");
 17         scanf("%d",&n);
 18         delete_pos(l,n);
 19         output_linklist(l);
 20         linklist_free(l);  
 21         return 0;
 22 }       

请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1	2	3	4	
请输入要删除的位置:2
1	3	4

单向链表按元素删除

//功能函数
int delete_element(linklist l,datatype e)
{
        if(l==NULL||l->len==0)
        {
                printf("按元素删除失败\n");
                return -1;
        }
        linklist p=l;
        for(int i=1;i<=l->len;i++)
        {
                p=p->next;
                if(p->data==e)
                {
                        delete_pos(l,i);
                        return 0;
                }
        }
        return -1;
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
        linklist l=create_node(1);
        int n;
        datatype e,key;
        printf("请输入插入元素的个数\n");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
                printf("请输入插入的值");
                scanf("%d",&e);
                insert_rear(l,e);
        }
        output_linklist(l);
        printf("请输入要删除的元素:");
        scanf("%d",&e);
        delete_element(l,e);
        output_linklist(l);
        linklist_free(l);
        return 0;
}
//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1	2	3	4	
请输入要删除的元素:3
1	2	4	

单向链表按元素修改

//功能函数
int update_element(linklist l,datatype e,datatype key)//按照元素修改
{
        if(l==NULL||l->len==0)
        {
                printf("按元素修改失败\n");
                return -1;
        }
        int pos=searh_element(l,e);
        if(pos==-1)
        {
                printf("查找不到该元素");
                return -1;
        }
        update_pos(l,pos,key);
        return 0;
}

int searh_element(linklist l,datatype e)//查找元素
{
        if(l==NULL||l->len==0)
        {
                printf("按元素查找失败\n");
                return -1;
        }
        linklist p=l;
        int pos=1;
        while(p->next!=NULL)
        {
                p=p->next;
                if(p->data==e) 
                        return pos;
                pos++;
        }
        return -1;
}

//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
        linklist l=create_node(1);
        int n;
        datatype e,key;
        printf("请输入插入元素的个数\n");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
                printf("请输入插入的值");
                scanf("%d",&e);
                insert_rear(l,e);
        }
        output_linklist(l);
        printf("请输入要查找的元素:");
        scanf("%d",&e);
        printf("请输入要修改的元素:");
        scanf("%d",&key);
        update_element(l,e,key);
        output_linklist(l);
        linklist_free(l);       
        return 0;
}

//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1	2	3	4	
请输入要查找的元素:3
请输入要修改的元素:33
1	2	33	4	

单向链表在给定元素前插入

//功能函数
int insert_element(linklist l,datatype e,datatype key)
{
        if(l==NULL||l->len==0)
        {
                printf("无法按元素插入\n");
                return -1;
        }
        int pos=searh_element(l,e);
        if(pos==-1)
        {
                printf("找不到该元素\n");
                return -1;
        }
        insert_pos(l,pos,key);

}

int searh_element(linklist l,datatype e)//查找函数
{
        if(l==NULL||l->len==0)
        {
                printf("按元素查找失败\n");
                return -1;
        }
        linklist p=l;
        int pos=1;
        while(p->next!=NULL)
        {
                p=p->next;
                if(p->data==e) 
                        return pos;
                pos++;
        }
        return -1;
}

//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
        linklist l=create_node(1);
        int n;
        datatype e,key;
        printf("请输入插入元素的个数\n");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
                printf("请输入插入的值");
                scanf("%d",&e);
                insert_rear(l,e);
        }
        output_linklist(l);
        printf("请输入要查找的元素:");
        scanf("%d",&e);
        printf("请输入要插入的元素:");
        scanf("%d",&key);
        insert_element(l,e,key);
        output_linklist(l);
        linklist_free(l);
        return 0;
}
//运行结果
请输入插入元素的个数
4
请输入插入的值1
请输入插入的值2
请输入插入的值3
请输入插入的值4
1	2	3	4	
请输入要查找的元素:2
请输入要插入的元素:22
1	22	2	3	4

单向链表排序

//功能函数
void sort(linklist l)
{
        if(l==NULL||l->len==0)
        {
                printf("无法排序\n");
                return;
        }
        if(l->len==1)
        {
                printf("无需排序\n");
                return;
        }
        linklist p=l->next;
        for(int i=1;i<l->len;i++)
        {
                p=l->next;
                for(int j=0;j<l->len-i;j++)
                {
                        if((p->data)>p->next->data)

                        {
                                datatype temp=p->data;
                                p->data=(p->next)->data;
                                (p->next)->data=temp;
                        }
                        p=p->next;
                }
        }
        output_linklist(l);
}
//主函数调用
#include "fun.h"
int main(int argc, const char *argv[])
{
        linklist l=create_node(1);
        int n;
        datatype e,key;
        printf("请输入插入元素的个数\n");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
                printf("请输入插入的值");
                scanf("%d",&e);
                insert_rear(l,e);
        }
        output_linklist(l);
        sort(l);
        linklist_free(l);   
        return 0;
}

//运行结果
请输入插入元素的个数
6
请输入插入的值213
请输入插入的值231
请输入插入的值23232
请输入插入的值544
请输入插入的值34
请输入插入的值235
213	231	23232	544	34	235	
34	213	231	235	544	23232	

单向链表全部释放

void linklist_free(linklist l)
{
        if(l==NULL)
                return;
        for(int i=0;i<l->len;i++)
        {
                linklist q=l->next;
                l->next=q->next;
                free(q);
                q=NULL;
        }
        l=NULL;
        return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值