嵌入式学习17(单链表)

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

typedef int DataType;
struct Node
{
    DataType data;  
    struct Node* next;
};

typedef struct Node Link,*pLink;
                //变量//指针变量
/********1/创建链表********/   //头插法//类似栈
bool InsertNode(pLink* top,DataType data)
{
    pLink pNew=(pLink)malloc(sizeof(Link));//1 申请节点空间
    if(NULL==pNew)
            return false;
    pNew->data=data;//2 存值  
                    //3 建立联系
    pNew->next=*top;//top第一次为空
    *top=pNew;
    return true;
}
/******2 遍历节点*******/
void Show(pLink top)
{
    while(top!=NULL)
    {
        printf("  %d",top->data);
        top=top->next;
    }

}
/******3 查找节点,成功返回数据地址,失败返回NULL******/
DataType* search(pLink top,DataType key)
{
    while(NULL!=top && top->data!=key)
    {
        top=top->next;
    }
    if(NULL==top)
            return NULL;
    else
            return &(top->data);
}
/********4 修改key的值********/
bool update(int key,pLink top,int newvalue)
{
        DataType* pData=search(top,key);
        if(pData!=NULL)
        {
            *pData=newvalue;
            return true;
        }
        return false;
}
/********5 删除节点*********/
//找前驱节点
pLink frontNode(int key,pLink link)
{
    pLink pfri=NULL,psec=link;
    while(NULL!=psec && psec->data!=key)
    {
        pfri=psec;
        psec=psec->next;
    }
    if(NULL!=psec)
            return pfri;
    else
            return NULL;//是头结点或不存在的节点
}
//删除元素:
bool delete(int key,pLink* plink)
{
//13 12 11 10 9  头部/无此节点---无前驱
    pLink pNode=frontNode(key,*plink);
    pLink pLoc=NULL;
    //头节点
    if(NULL!=pNode)//非头节点
    {
        pLoc=pNode->next;//记录key节点
        pNode->next=pNode->next->next;
    }
    else if((*plink)->data==key)//如果是头节点
    {
        pLoc=*plink;
        *plink=(*plink)->next;
    }
    //查找成功
    if(NULL!=pLoc)
    {
        free(pLoc);
        return true;
    }
    return false;

}

void main()
{
    pLink head=NULL;
    InsertNode(&head,1);
    InsertNode(&head,2);
    InsertNode(&head,3);
    Show(head);
    putchar(10);
    delete(3,&head);
    Show(head);
    putchar(10);
}

上面是老师的标准写法,对问题考虑很全面,然后我之前也自己看过一些教科书籍,对上面部分功能有不同的解法,给大家借鉴一下。

/****** 修改,把第n个元素修改为x*******/
void mod(pLink top,int n,DataType x)
{
    int i=1;
    while(i!=n)
    {
        top=top->next;
        i++;
    }
    top->data=x;
}
/******** 删除节点*********/
void DeleteHead(pLink* top)
{
    pLink head=*top;
    *top=(*top)->next;//优先级问题!!没有括号报错(在非结构或联合中请求next)
    free(head);
}
void DeleteMid(pLink top,int key)//删除中间和删除尾巴一样
{
    pLink tmp;
    while(top->next->data!=key)
    {
        top=top->next;
    }
    tmp=top->next;
    top->next=top->next->next;
    free(tmp);
}
/******** 尾插法*******/
void InsertNode1(pLink *top,DataType data)
{
    pLink head;
    head=*top;

    pLink pNew=(pLink)malloc(sizeof(pLink));
    pNew->data=data;
    pNew->next=NULL;

    if(head==NULL)
    {
        *top=pNew;
    }
    if(head!=NULL){
    while(head->next!=NULL)
    {
            head=head->next;
    }
    head->next=pNew;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值