线性表之单链表

#include<iostream>
using namespace std;
/*
有一个头节点
下标都是从0开始
头节点的下表是0,所以元素的下标是从1开始,添加删除都是以1为下标的位置
头节点的value代表链表长度
*/
struct LinkNode
{
    int value;
    LinkNode* next;
};
LinkNode* createLinkList()
{
    LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
    head->next=NULL;
    head->value=0;
    return head;
}
bool insertElem(int pos,int value,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p!=NULL && j<pos-1)//定位到pos-1的元素,也就是待插入元素的前一个元素
    {
        p=p->next;
        j++;
    }
    if(p!=NULL)//限制插入元素的位置是 【1,链表长度+1】这个闭区间
    {            //因此这里辅助指针的位置【0,链表长度】这个闭区间
        LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
        newNode->value=value;
        newNode->next=p->next;
        p->next=newNode;
        head->value++;
        return 1;
    }
    return 0;
}
bool deleElem(int pos,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p->next!=NULL && j<pos-1)
    {
        p=p->next;
        j++;
    }
    if(p->next!=NULL)//限制删除元素的位置是 【1,链表长度】这个闭区间
    {                 //因此这里辅助指针的位置【0,链表长度-1】这个闭区间
        LinkNode* q = p->next;
        p->next=q->next;
        delete(q);
        head->value--;
        return 1;
    }
    return 0;
}
void clearLinkList(LinkNode* head)
{
    LinkNode*p = head->next;
    while(p!=NULL)
    {
        LinkNode*q=p->next;
        deleElem(1,head);//每次删除第一个,逐个删除
        p=q;
    }
}
void destroyLinkList(LinkNode* head)
{
    clearLinkList(head);
    delete head;
    head = 0;
}
 
void outPut(LinkNode* head)
{
    if(head == NULL)
    {
        cout<<"link list dose not exist"<<endl;
        return;
    }
    if(head->value==0)
    {
        cout<<"link list is empty"<<endl;
        return;
    }
    LinkNode* p = head->next;
    while(p!=NULL)
    {
        cout<<p->value<<" ";
        p=p->next;
    }
    cout<<endl;
}
void main()
{
    int len=12;
    LinkNode* L= createLinkList();
    int v;
    for(int i=0;i<len;i++)
    {
        v = rand() % 100;
        cout<<v<<" ";
        insertElem(1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序相反
    }
    cout<<endl;
    outPut(L);
    destroyLinkList(L);
    //outPut(L);
 
    L= createLinkList();
    for(int i=0;i<len;i++)
    {
        v = rand() % 100;
        cout<<v<<" ";
        insertElem(L->value+1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序一致
    }
    cout<<endl;
    outPut(L);
 
    insertElem(3,999,L);
    outPut(L);
 
    insertElem(100,999,L);
    outPut(L);
 
    insertElem(L->value,9999,L);
    outPut(L);
 
    insertElem(L->value+1,8888,L);
    outPut(L);
 
    insertElem(1,7777,L);
    outPut(L);
 
    deleElem(1,L);
    outPut(L);
 
    deleElem(100,L);
    outPut(L);
 
    deleElem(7,L);
    outPut(L);
 

    deleElem(L->value,L);
    outPut(L);

    deleElem(L->value+1,L);
    outPut(L);
 
    clearLinkList(L);
    outPut(L);
    cin>>len;
}


#include<iostream>
using namespace std;
/*
有一个头节点
下标都是从0开始
头节点的下表是0,所以元素的下标是从1开始,添加删除都是以1为下标的位置
头节点的value代表链表长度
*/
struct LinkNode
{
    int value;
    LinkNode* next;
};
LinkNode* createLinkList()
{
    LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
    head->next=NULL;
    head->value=0;
    return head;
}
bool insertElem(int pos,int value,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p!=NULL && j<pos-1)//定位到pos-1的元素,也就是待插入元素的前一个元素
    {
        p=p->next;
        j++;
    }
    if(p!=NULL)//限制插入元素的位置是 【1,链表长度+1】这个闭区间
    {            //因此这里辅助指针的位置【0,链表长度】这个闭区间
        LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
        newNode->value=value;
        newNode->next=p->next;
        p->next=newNode;
        head->value++;
        return 1;
    }
    return 0;
}
bool deleElem(int pos,LinkNode* head)
{
    if(pos<=0)return 0;
    LinkNode* p = head;
    int j=0;
    while(p->next!=NULL && j<pos-1)
    {
        p=p->next;
        j++;
    }
    if(p->next!=NULL)//限制删除元素的位置是 【1,链表长度】这个闭区间
    {                 //因此这里辅助指针的位置【0,链表长度-1】这个闭区间
        LinkNode* q = p->next;
        p->next=q->next;
        delete(q);
        head->value--;
        return 1;
    }
    return 0;
}
void clearLinkList(LinkNode* head)
{
    LinkNode*p = head->next;
    while(p!=NULL)
    {
        LinkNode*q=p->next;
        deleElem(1,head);//每次删除第一个,逐个删除
        p=q;
    }
}
void destroyLinkList(LinkNode* head)
{
    clearLinkList(head);
    delete head;
    head = 0;
}
 
void outPut(LinkNode* head)
{
    if(head == NULL)
    {
        cout<<"link list dose not exist"<<endl;
        return;
    }
    if(head->value==0)
    {
        cout<<"link list is empty"<<endl;
        return;
    }
    LinkNode* p = head->next;
    while(p!=NULL)
    {
        cout<<p->value<<" ";
        p=p->next;
    }
    cout<<endl;
}
void main()
{
    int len=12;
    LinkNode* L= createLinkList();
    int v;
    for(int i=0;i<len;i++)
    {
        v = rand() % 100;
        cout<<v<<" ";
        insertElem(1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序相反
    }
    cout<<endl;
    outPut(L);
    destroyLinkList(L);
    //outPut(L);
 
    L= createLinkList();
    for(int i=0;i<len;i++)
    {
        v = rand() % 100;
        cout<<v<<" ";
        insertElem(L->value+1,v,L);//每次在链表尾部插入,使得输入的顺序和链表中的顺序一致
    }
    cout<<endl;
    outPut(L);
 
    insertElem(3,999,L);
    outPut(L);
 
    insertElem(100,999,L);
    outPut(L);
 
    insertElem(L->value,9999,L);
    outPut(L);
 
    insertElem(L->value+1,8888,L);
    outPut(L);
 
    insertElem(1,7777,L);
    outPut(L);
 
    deleElem(1,L);
    outPut(L);
 
    deleElem(100,L);
    outPut(L);
 
    deleElem(7,L);
    outPut(L);
 

    deleElem(L->value,L);
    outPut(L);

    deleElem(L->value+1,L);
    outPut(L);
 
    clearLinkList(L);
    outPut(L);
    cin>>len;
}

原文地址:https://www.cnblogs.com/kbyd/p/3988169.html