单链表的创建与基本操作

链表通过“指针”将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫作后继指针 next。

把第一个结点叫作头结点,把最后一个结点叫作尾结点。其中,头结点用来记录链表的基地址。而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址 NULL,表示这是链表上最后一个结点。

#include <iostream>
#include <malloc.h>
using namespace std;

typedef int ElementType;

//链表节点的定义
typedef struct ListNode
{
    ElementType Element;//数据域,存放数据
    ListNode * Next;//指向下一个链表节点
}Node,*PNode;
//创建链表
PNode CreateList(void)
{
    int len;//用于定义链表的长度
    int val;//用于存放节点数值
    PNode PHead = (PNode)malloc(sizeof(Node));//创建分配一个头结点内存空间

    //用于检测空间是否分配
    if(PHead == NULL)
    {
        printf("空间分配失败\n");
        exit(-1);
    }

    PNode PTail = PHead;//定义链表的末尾节点,初始与头结点一致。
    PTail->Next = NULL;//最后一个节点指针置为空
    printf("print the num of Node: ");
    scanf("%d",&len);//输入节点数

    for(int i = 0;i<len;i++)
    {
        PNode pNew = (PNode)malloc(sizeof(Node));//分配一个新节点
        if(pNew == NULL){
            printf("failed");
            exit(-1);
        }
        printf("the %d Node :",i+1);
        scanf("%d",&val);

        pNew->Element = val;
        PTail->Next = pNew;//末尾节点指针指向下一个新节点
        pNew->Next = NULL;//新节点指针指向为空
        PTail = pNew;//将新节点复制给末尾节点
    }
    printf("list ok\n");
    return PHead;//返回头节点
}
//链表的遍历操作
void TraverseList(PNode List)
{
    PNode P = List->Next;//首节点复制给临时变量,第一个节点
    if(P == NULL)
    {
        printf("failed");
    }
    while(P != NULL){
        printf("%d  ",P->Element);
        P = P->Next;
    }
    printf("\n");
}
//链表的查找操作
PNode FindList(PNode List)
{
    PNode p = List->Next;//首节点复制给临时变量,第一个节点
    int num = 0;  //    用于记录链表节点位置
    int val = 3; //    用于存放要查询的值
    while(p !=NULL && p->Element != val)
    {
        p = p->Next;
        num++;
    }
    if(p !=NULL)
    {
        printf("%d\n",num+1);//节点为第一个节点开始
    }
    else
    {
        printf("no found\n");
    }
    printf("\n");
    return p;
}
//在链表位置第pos节点前插入包含数据val的节点
void InsertList(PNode List,int pos,int val)
{
    int position = 0;
    PNode p = List;//定义节点指向"头结点"

    //寻找pos节点的前驱结点
    while(p !=NULL && position<pos-1)
    {
        p = p->Next;
        position++;
    }

    PNode Tmp = (PNode)malloc(sizeof(PNode));//分配一个临时节点用来存储要插入的数据
    if(Tmp == NULL){
        printf("failed\n");
        exit(-1);
    }
    //插入节点
    Tmp->Element = val;
    Tmp->Next = p->Next;
    p->Next = Tmp;
}
//删除链表中的元素
//删除链表中的第pos节点
void DeleteList(PNode List,int pos)
{
    int position = 0;
    PNode p = List;

    while(p != NULL && position<pos-1)
    {
        p = p->Next;
        position++;
    }
    //删除节点
    PNode Tmp = p->Next;//定义临时指针Tmp指向要删除的节点
    p->Next = Tmp->Next; //使要删除节点的前驱结点指向其后驱节点
    free(Tmp);//释放删除节点的内存空间,防止内存泄漏
    Tmp = NULL;//使q指向空指针,防止产生野指针
}

//删除整个链表操作
void DeleteTheList(PNode List)
{
    PNode p,Tmp;
    p = List->Next;
    List->Next = NULL;
    while(P != NULL)
    {
        Tmp = p->Next;//定义指针P指向链表要删除的链表List的第一个点节点
        free(p); //释放指针P指向的节点
        p = Tmp;//重新赋值
    }
}
//主函数
int main()
{
    PNode List = CreateList();
    TraverseList(List);
//    FindList(List);
    InsertList(List,2,0);
    TraverseList(List);
    DeleteList(List,2);
    TraverseList(List);
    return 0;
}

参照地址:http://www.cnblogs.com/maluning/p/7966875.html

猜你喜欢

转载自blog.csdn.net/zhaol_90/article/details/85047793