单链表的实现 (C语言版 数据结构 严蔚敏)

#include<stdlib.h>
#include<stdio.h>

typedef struct LNode {
    int data;
    struct LNode* next;
}LNode,*LinkList;

LinkList CreateLinkList(LinkList L);           //创建单链表,并返回头指针
int GetElemLinkList(LinkList L, int *e);    //查找单链表第i位在值,并返回给e
int InsertLinkList(LinkList L, int i, int e);     //在第i个位置插入e值
int DeleteLinkList(LinkList L, int i, int* e);     //删除第i个位置的元素,把删除的值返给e
int UpdateLinkList(LinkList L);     //改变数据 ,先增加再删除。
void print(LinkList L);      //遍历单链表


void main()
{
    LinkList LHead=NULL;   //头结点为空
    int a = 0;
    LHead=CreateLinkList(LHead);
    //a = GetElemLinkList(LHead,&a);
    //a = DeleteLinkList(LHead,2 , &a);
    //InsertLinkList(LHead, 2,2);
    //UpdateLinkList(LHead);
    
    print(LHead);
    return;
}

LinkList CreateLinkList(LinkList L)    //创建有头结点的单链表,长度为n ,从末尾开始插入数据
{
    LinkList p;
    int i;
    int length;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    printf("请输入单链表的长度");
    scanf("%d", &length);
    for(i=length;i>0;--i)
    {
        printf("请输入第%d位元素  ",i);
        p = (LinkList)malloc(sizeof(LNode));   //生成新结点
        scanf("%d", &p->data);
        p->next = L->next; L->next = p;    //插入到表头
    }
    return L->next;
}

void print(LinkList L) //遍历数据显示元素,从第一个元素开始,正历。
{
    LinkList p = L;
    while (p!=NULL)
    {
        printf("%2d", p->data);
        p = p->next;
    }
    return;
}

int GetElemLinkList(LinkList L, int* e)
{
    LinkList p = L; 
    int i;
    int j = 1;
    printf("请输入第i个位置  ");
    scanf("%d", &i);
    while (p && j < i)
    {
        p = p->next; ++j;
    }
    if (!p || j > i)
    {
        return -1;
    }
    *e = p->data;
    printf("第%d个元素是%2d",i,*e);
    return *e;
}

int InsertLinkList(LinkList L, int i, int e)   
{
    LinkList p = L; int j = 1;

    while (p && j < i - 1)
    {
        p = p->next; ++j;     //寻找第i-1个结点
    }
    if (!p || j > i - 1) return -1;
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next; p->next = s;
    return 1;
}

int DeleteLinkList(LinkList L, int i, int* e)
{
    LinkList p = L;int j = 1;
    //LinkList q = L;
    while (p->next && j < i-1 )    //寻找第i个结点,并令p指向其前趋
    {
        p = p->next; ++j;
    }
    if (!(p->next) || j > i-1)
    {
        printf("删除位置不合理");
        return -1;
    }
    /*q = p->next; p->next = q->next;
    *e = q->data;*/
    *e = p->next->data;
    p->next = p->next->next;
    printf("被删除的是第%d个元素%d  ", i, *e);
    return *e;
    
}

int UpdateLinkList(LinkList L)     
{
    int i,val;
    printf("请输入修改的第i个位置");
    scanf("%d", &i);
    //==DeleteLinkList(L,2,2)
    printf("请输入修改的值为");
    scanf("%d", &val);
    InsertLinkList(L, i, val);
    DeleteLinkList(L, i+1, &i);
    return 1;

}  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值