【C语言】单链表练习

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct Node
{
    int data;
    struct Node *next;
} LNode, *Linklist;

void InitList(Linklist *L);
void HeadInsertList(Linklist *L, int e);
void TailInsertList(Linklist *L, int e);
Linklist FindTail(Linklist *L);
Linklist FindElemByPos(Linklist *L, int n);
Linklist FindElemByNum(Linklist *L, int e);
int DeleteElem(Linklist*L,int n);
int GetElem(Linklist *L, int n);
int TellListLength(Linklist *L);
void PrintList(Linklist *L);

int main()
{   
    Linklist L;
    InitList(&L);
    for (int i = 1; i < 10; i++)
        HeadInsertList(&L,i);
    PrintList(&L);
    DeleteElem(&L,3);
    PrintList(&L);
    system("pause");
    return 0;
}

void InitList(Linklist *L)
{
    (*L) = (Linklist)malloc(sizeof(LNode));
    (*L)->next = NULL;
}

void HeadInsertList(Linklist *L, int e)
{
    LNode *p = (LNode *)malloc(sizeof(LNode));
    if (p)
    {
        p->data = e;
        p->next = (*L)->next;
        (*L)->next = p;
    }
}

void TailInsertList(Linklist *L, int e)
{
    LNode *p = FindTail(L);
    LNode *temp = (LNode *)malloc(sizeof(LNode));
    if (temp)
    {
        temp->data = e;
        temp->next = p->next;
        p->next = temp;
    }
}

Linklist FindTail(Linklist *L)
{
    LNode *p = (*L);
    while (p->next != NULL)
    {
        p = p->next;
    }
    return p;
}

Linklist FindElemByPos(Linklist *L, int n)
{   
    LNode *p = (*L)->next;
    int j=1;
    while ((p != NULL)&&j<n)
    {
        p = p->next;
        j++;
    } 
    return p;
}

Linklist FindElemByNum(Linklist *L, int e)
{
    LNode *p = (*L)->next;
    while ((p != NULL) && (p->data != e))
    {
        p = p->next;
    }
    return p;
}

int DeleteElem(Linklist *L, int n)
{   int data=-1;
    LNode *p=FindElemByPos(L,n-1);
    LNode *q=p->next;
    data=q->data;
    p->next=q->next;
    free(q);
    return data;
}

Linklist FindElem(Linklist *L, int n)
{
    int j = 1;
    LNode *p = (*L)->next;
    while (p != NULL && j < n)
    {
        p = p->next;
        j++;
    }
    return p;
}

int GetElem(Linklist *L, int n)
{
    if (n < 1)
        return -1;
    LNode *p = FindElem(L, n);
    return p->data;
}

int TellListLength(Linklist *L)
{
    int cnt=0;
    LNode*p=(*L)->next;
    while(p!=NULL)
    {
        p=p->next;
        cnt++;
    }
    return cnt;
}

void PrintList(Linklist *L)
{
    LNode*p=(*L)->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值