静态链表操作与实现

链表:一种链式存储的线性表,用一组任意存储的地址单元来存放线性表的数据元素,称存储单元为一个结点。

listnode.h

#define CRT_SECURE_NO_WARNING_1
#include
#include
#include

typedef   int DataType;
typedef struct listnode
{
    struct listnode* next;   //指向链表的下一个结点
    DataType data;         //结点的数据
}listnode,*plistnode;



void Initlistnode(plistnode* phead);//初始化 

void listnodepushfront(plistnode *phead, DataType x);//头插
void listnodePopfront(plistnode *phead);//头删
void listnodePushBack(plistnode* phead, DataType data);//尾插,找到倒数第二个
void listnodePopBack(plistnode*  phead);//尾删
void listnodePosInsert(plistnode* phead, DataType data);//任意位置插入pos
void listnodePosEraser(plistnode *phead, DataType pos);//任意位置删除
void listnodeDataFind(plistnode *phead, DataType data);//查找
int listnodeAccquire(plistnode phead, int count);//获取值为data的结点
void IsEmpty(plistnode phead);//判空

void listnodeDestory(plistnode *phead);//销毁




listnode.c

#define CRT_SECURE_NO_WARNING_1
#include"listnode.h"

//plistnode Buylistnode(plistnode* phead)
//{
//  plistnode pNew;
//
//}
plistnode Buynode(DataType data)  //建立新节点

{
    plistnode newnode = (listnode*)malloc(sizeof(listnode));  //申请新节点
    if (NULL == newnode)
    {
        //assert(0);
        return NULL;
    }
    newnode->data = data;
    newnode->next = NULL;
    return newnode;
}
void Initlistnode(plistnode* phead)//初始化 
{
    assert(phead);
    (*phead) = NULL;
}
//void listnodepushfront(listnode *phead, DataType x)//头插
//
//{
//  if (phead == NULL)
//  {
//      phead = (listnode*)malloc(listnodedesqi)
//  }
//}
void listnodePushBack(plistnode* phead, DataType data)//尾插
{
    assert(phead);  //是否存在
    plistnode pcur;
    if (NULL == (*phead))  //链表为空

    {
        (*phead) = Buynode(data);//直接指向新节点
    }

    else
    {
        pcur = *phead;
        while (pcur->next)//链表不为空,找最后一个节点

        {
            pcur = pcur->next;  //往后走

        }
        pcur->next = Buynode(data);
    }



}
void listnodePrint(plistnode phead)//打印
{
    plistnode pCur = phead;
    while (pCur != NULL)
    {
        printf("%d->", pCur->data);
        pCur = pCur->next;
    }
    printf("NULL\n");

}
void listnodePopBack(plistnode*  phead)//尾删
{
    plistnode  pCur = (*phead);
    plistnode ppCur = NULL;
    while (pCur->next)//易错点
    {
        ppCur = pCur;
        pCur = pCur->next;
    }
    ppCur->next = NULL;
}
void listnodepushfront(plistnode *phead, DataType x)//头插
{
    listnode* pCur = Buynode(x);  //注意Buynode的返回值
    pCur->next = (*phead);
    (*phead) = pCur;

}
void listnodePopfront(plistnode *phead)//头删
{
    //plistnode pCur = (*phead);
    (*phead )= (*phead)->next;

}
void listnodePosInsert(plistnode* phead,plistnode pos,DataType data)//任意位置插入pos
{
    plistnode newnode = Buynode(data);
    plistnode pCur = (*phead);
    plistnode ppCur = NULL;
    while (pCur != pos)
    {
        ppCur = pCur;
        pCur = pCur->next;
    }
    pCur->next = newnode;
    newnode->next = pos;


}
void  listnodePosEraser(plistnode *phead, DataType pos)//任意位置删除,两种方法(plistnode pos)
{
    /*plistnode pCur = (*phead); //方法一
    while (pCur->next != pos)
    {
        pCur = pCur->next;
    }
    pCur->next = pos->next;
    free(pos);*/
    //////////////////////////////////////////////////////////////////////////
    int i = 1;     //方法二
    plistnode pCur = (*phead);
    plistnode ppCur = NULL;
    for (; i < pos; i++)
    {
        ppCur = pCur;
        pCur = pCur->next;

    }
    ppCur->next = pCur->next;
    free(pCur);
}
void listnodeDataFind(plistnode phead, DataType data)//查找
{
    plistnode pCur = phead;
    while (pCur != NULL)
    {
        if (pCur->data == data)
        {
            printf("查找成功\n");
            break;
        }
        pCur = pCur->next;
    }
    if (pCur == NULL)
        printf("查找失败\n");

}
int listnodeAccquire(plistnode phead,DataType data)//获取值为data的结点
{
    plistnode pCur = phead;
    int count = 0;
    while (pCur != NULL)
    {
        if (pCur->data == data)
        {
            count++;
        }
        pCur = pCur->next;
    }
    return count;

}
void IsEmpty(plistnode phead)//判空
{
    if (phead == NULL)
        printf("此链表为空\n");
    else
        printf("此链表不为空\n");
}

void listnodeDestory(plistnode *phead)//销毁
{
    plistnode p = (*phead);
    plistnode pp = NULL;
    while (p)
    {
        pp = p->next;
        free(p);
        p = pp;
    }
}

//代码测试
Testlistnode()
{
     plistnode phead;
     Initlistnode(&phead);//传地址可以改变所指的内容
     listnodePushBack(&phead, 1);
     listnodePushBack(&phead, 2);
     listnodePushBack(&phead, 3);
     listnodePushBack(&phead, 4);
     listnodePushBack(&phead, 5);
     listnodePushBack(&phead, 5);
     listnodePrint(phead);//打印
     //listnodePopBack(&phead);//尾删
     //listnodePrint(phead);//打印 
     //listnodepushfront(&phead, 8);
     //listnodePrint(phead);//打印
     //listnodePopfront(&phead);//头删
     //listnodePrint(phead);//打印
     //listnodePosInsert(&phead, 3, 9);
     //listnodePrint(phead);//打印
     //listnodePosEraser(&phead);
     //listnodePrint(&phead);//打印
     //listnodeDataFind(&phead, 10);
    // printf("%d\n", listnodeAccquire(phead, 5));//获取值为data的结点
     //IsEmpty(phead);//判空

}

tect.c

define CRT_SECURE_NO_WARNING_1
include
include<Windows.h>
include"listnode.h"
int main()
{
    Testlistnode();
    system("pause");
    return 0;
}

你可能感兴趣的:(数据结构,链表,静态链表,操作,实现)