嵌入式学习17(单链表)

来源:互联网 发布:七星彩计划软件 编辑:程序博客网 时间:2024/06/05 07:06
#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;    }}