day4链表

#ifndef __H1__H
#define __H1__H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype[20];

typedef struct Node
{
    union
    {
        int len;//头结点的数据域
        datatype data;//其他节点的数据域数据元素
    };
    struct Node *next;//指针域;下一个节点的地址
}*Linklist;

Linklist create_head();
Linklist create_node();
void output(Linklist L);
int insert_head(Linklist L,datatype e);
int insert_rear(Linklist L,datatype e);
int delete_head(Linklist L);
int delete_rear(Linklist L);
int insert_by_pos(Linklist L,int pos,datatype e);
int delete_by_pos(Linklist L,int pos);
int alter_by_pos(Linklist L,int pos,datatype e);
int search_by_pos(Linklist L,int pos);
#endif
#include "h1.h"

int main(int argc, const char *argv[])
{
    Linklist link=create_head();
    int n;
    datatype e;


    printf("请输入插入元素的个数");
    scanf("%d%*c",&n);
    for(int i=0;i<n;i++)
    {
        printf("请输入第%d个值\n",i+1);
        scanf("%s%*c",e);
    //    insert_head(link,e);
        insert_rear(link,e);
    }
    output(link);
    


    printf("请输入想要在头部插入的值\n");
    scanf("%s",e);
    insert_head(link,e);
    output(link);

    
    printf("请输入想要在尾部插入的值\n");
    scanf("%s",e);
    insert_rear(link,e);
    output(link);
    
    
    printf("删除头部值\n");
    delete_head(link);
    output(link);
    

    printf("删除尾部值\n");
    delete_rear(link);
    output(link);
    
    int pos;
    printf("请输入想要插入的位置");
    scanf("%d%*c",&pos);    
    printf("请输入想要插入的值");
    scanf("%s",e);
    insert_by_pos(link,pos,e);
    output(link);

    
    printf("请输入想要删除的位置");
    scanf("%d%*c",&pos);    
    delete_by_pos(link,pos);
    output(link);
    

    printf("请输入想要修改的位置");
    scanf("%d%*c",&pos);    
    printf("请输入想要修改的值");
    scanf("%s",e);
    alter_by_pos(link,pos,e);
    output(link);

    
    printf("请输入想要查找的位置");
    scanf("%d%*c",&pos);    
    search_by_pos(link,pos);
    

    return 0;
}

#include "h1.h"
//函数1 创建头结点
Linklist create_head()
{
    Linklist L=(Linklist)malloc(sizeof(struct Node));
    if(L==NULL)
        return NULL;
    L->len=0;
    L->next=NULL;
    return L;
}


//函数2 创建中间节点空间
Linklist create_node()
{
    Linklist p=(Linklist)malloc(sizeof(struct Node));
    if(p==NULL)
        return NULL;
    strcpy(p->data,"");
    p->next=NULL;
    return p;
}
//函数3 遍历输出
void output(Linklist L)
{
    //1,判断头结点是存在
    //2,判断链表是否为空
    if(L==NULL || L->len==0)
    {
        printf("失败\n");
    }
    while(L->next!=NULL)
    {
        L=L->next;
        printf("%s\t",L->data);
    }
    printf("\n");
}
//函数4 永远从头结点后面插入
int insert_head(Linklist L,datatype e)
{
    if(L==NULL)
    {
        printf("头插失败\n");
        return -1;
    }
    //在堆区申请其他节点
    Linklist p=create_node();
    //P的数据赋值为e
    strcpy(p->data,e);
    //p的指针域
    p->next=L->next;
    L->next=p;
    //链表长度自增
    L->len++;
}

//函数4 永远从尾部插入
int insert_rear(Linklist L,datatype e)
{
    //判断头结点是否存在
    if(L==NULL)
        return -1;
    //尾部插入
    //先找到最后一个节点
    Linklist p=L;
    while(p->next)
    {
        p=p->next;
    }
    //创建一个新的节点
    Linklist s=create_node();
    if(s==NULL)
        return -1;
    //s的数据域
    strcpy(s->data,e);
    //s的指针域
    p->next=s;
    L->len++;
    return 0;
}

//头部删除
int delete_head(Linklist L)
{
    if(L==NULL || L->len==0)
    {
        printf("删除失败\n");
        return -1;
    }
    Linklist p=L->next;
    L->next=p->next;
    free(p);
    p=NULL;
    L->len--;
    return 0;

}
//尾部删除
int delete_rear(Linklist L)
{
    if(NULL==L ||L->len==0)
    {
        printf("删除失败");
        return -1;
    }
    Linklist p=L;
    for(int i=0;i<L->len-1;i++)
    {
        p=p->next;
    }
    free(p->next);
    p->next=NULL;
    L->len--;
    return 0;
}

//按位置插入
int insert_by_pos(Linklist L,int pos,datatype e)
{
    if(L==NULL ||pos<1 || pos>L->len+1)
    {
        printf("插入失败\n");
        return -1;
    }
    Linklist p=L;
    for(int i=0;i<pos-1;i++)
        p=p->next;

    Linklist s=create_node();
    strcpy(s->data,e);
    s->next=p->next;
    p->next=s;
    return 0;
}
//按位置删除
int delete_by_pos(Linklist L,int pos)
{
    
    if(L==NULL ||pos<1 || pos>L->len+1)
    {
        printf("删除失败\n");
        return -1;
    }
    Linklist p=L;
    for(int i=0;i<pos-1;i++)
        p=p->next;
    Linklist p1=p->next;
    p->next=p1->next;
    free(p1);
    p1=NULL;
    return 0;
}
//按位置修改
int alter_by_pos(Linklist L,int pos,datatype e)
{
    
    if(L==NULL ||pos<1 || pos>L->len+1)
    {
        printf("删除失败\n");
        return -1;
    }    

    Linklist p=L;
    for(int i=0;i<pos;i++)
        p=p->next;
    strcpy(p->data,e);
    return 0;

}
//任意位置查找
int search_by_pos(Linklist L,int pos)
{

    if(L==NULL ||pos<1 || pos>L->len+1)
    {
        printf("位置查找失败\n");
        return -1;
    }
    Linklist p=L;
    for(int i=0;i<pos;i++)
        p=p->next;
       printf("%s\t",p->data);
       return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值