day4数据结构-单向链表

head.h

#ifndef __HEAD_H__
#define __HEAD_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 creat_head();
linklist creat_node();
int insert_head(linklist L,datatype e);
void output(linklist L);
int insert_rear(linklist L,datatype e);
int delete_head(linklist L);
int delete_rear(linklist L);
int insert_pos(linklist L,int pos,datatype e);
int delete_pos(linklist L,int pos);
int update_pos(linklist L,int pos,datatype e);
int search_pos(linklist L,int pos);




#endif

hanshu.c


#include "head.h"
/*
 * function:    创建头结点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
linklist creat_head()
{
    linklist l=(linklist)malloc(sizeof(struct Node));
    if(l==NULL)
        return NULL;
    l->len=0;
    l->next=NULL;
    return l;

}
/*
 * function     创建结点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
linklist creat_node()
{
    linklist l=(linklist)malloc(sizeof(struct Node));
    if(l==NULL)
        return NULL;
    //字符串初始化
    strcpy(l->data,"");
    l->next=NULL;
    return l;

}
/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int insert_head(linklist L,datatype e)
{
    if(L==NULL)
    {
        printf("头插失败\n");
        return -1;
    }
    linklist p=creat_node();
    strcpy(p->data,e);
    p->next=L->next;
    L->next=p;
    L->len++;
    return 0;
}
/*
 * function:    遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(linklist L)
{
    //判断头结点是否存在,且有结点
    if(L==NULL||L->len==0)
    {
        printf("失败\n");
        return;
    }
    linklist p=L;
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%s\t",p->data);
    }
    printf("\n");
}
/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int insert_rear(linklist L,datatype e)
{
    //判断头结点是否存在
    if(L==NULL)
    {
        printf("失败\n");
    }
    linklist p=L;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    linklist q=creat_node();
    if(q==NULL)
        printf("失败\n");
    strcpy(q->data,e);
    p->next=q;
    L->len++;
    return 0;

}
/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
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;
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int delete_rear(linklist L)
{
    //判断头结点是否存在,且有结点
    if(L==NULL||L->len==0)
    {
        printf("失败\n");
        return -1;
    }
    linklist p=L;
    //找到倒数第二个结点
    for(int i=0;i<L->len-1;i++)
    {
        p=p->next;
    }
    linklist q=p->next;
    free(q);
    q=NULL;
    p->next=NULL;
    L->len--;
    return 0;
}
/*
 * function:    按位置插入
 * @param [ in]  插入位置Pos 
 * @param [out] 
 * @return      
 */
int insert_pos(linklist L,int pos,datatype e)

{
    //判断头结点是否存在,且pos合法
    if(L==NULL||pos<0||pos>L->len)
    {
        printf("失败\n");
        return -1;
    }
    linklist p=L;
    //找到插入位置倒数第二个结点
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }
    linklist s=creat_node();
    strcpy(s->data,e);
    s->next=p->next;
    p->next=s;
    L->len++;
    return 0;
}
/*
 * function:    按位置删除
 * @param [ in]  删除位置Pos 
 * @param [out] 
 * @return      
 */
int delete_pos(linklist L,int pos)

{
    //判断头结点是否存在,且pos合法
    if(L==NULL||pos<0||pos>L->len)
    {
        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;
}
/*
 * function:    按位置更改元素
 * @param [ in]   
 * @param [out] 
 * @return      
 */
int update_pos(linklist L,int pos,datatype e)

{
    //判断头结点是否存在,且pos合法
    if(L==NULL||pos<0||pos>L->len)
    {
        printf("失败\n");
        return -1;
    }
    linklist p=L;
    //找到需要改变的位置
    for(int i=0;i<pos;i++)
    {
        p=p->next;
    }
    strcpy(p->data,e);
    return 0;
}
/*
 * function:    按位置查找元素
 * @param [ in]   
 * @param [out] 
 * @return      
 */
int search_pos(linklist L,int pos)

{
    //判断头结点是否存在,且pos合法
    if(L==NULL||pos<0||pos>L->len)
    {
        printf("失败\n");
        return -1;
    }
    linklist p=L;
    //找到查找位置;
    for(int i=0;i<pos;i++)
    {
        p=p->next;
    }
    printf("该位置元素为:%s\n",p->data);
    return 0;
}
  1. c

#include "head.h"

int main(int argc, const char *argv[])
{
/*    linklist L=creat_head();
    int n;
    datatype e;
    printf("输入插入数据元素个数");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        printf("输入插入的字符");
        scanf("%s",e);
        insert_head(L,e);
    }
    output(L);
*/
    linklist L=creat_head();
    int n;
    datatype e;
    printf("输入插入数据元素个数");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        printf("输入插入的字符");
        scanf("%s",e);
        insert_rear(L,e);
    }
    output(L);
    delete_rear(L);
    output(L);
    int pos;
    printf("输入插入位置:");
    scanf("%d",&pos);
    printf("输入插入元素:");
    scanf("%s",e);
    insert_pos(L,pos,e);
    output(L);
    
    printf("输入删除位置:");
    scanf("%d",&pos);
    delete_pos(L,pos);
    output(L);

    printf("输入需要改变的位置:");
    scanf("%d",&pos);
    printf("输入需要改变的元素:");
    scanf("%s",e);
    update_pos(L,pos,e);
    output(L);
    
    printf("输入查询位置:");
    scanf("%d",&pos);
    search_pos(L,pos);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值