数据结构之单链表的C语言实现

使用C语言实现的单链表基本功能。

通过动态分配内存的方式实现了单链表,需要注意的地方:和静态分配内存的区别主要在于没有默认链表长度,在申请内存的时候需要(LinkList)malloc(sizeof(LNode))语句,在删除节点时需要释放内存(free(p))


具体的有

|单链表建立的两种方式,头插法(createList_1)和尾插法(createList_2)
|插入元素
|删除元素
|获取长度
|打印链表
|通过输入位置输出对应数据

其中在输入过程中,输入9999表示输入结束
如果输出有9999,说明对链表操作的过程中超过链表范围了,会输出9999

代码如下

#include 
#include 
using namespace std;

typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;

LinkList    createList_1(LinkList &L);
LinkList    createList_2(LinkList &L);
int         getElement(LinkList &L, int i);
int         getLength(LinkList &L);
void        printList(LinkList &L);
bool        insertNode(LinkList &L, int val, int i);
int         deleteNode(LinkList &L, int i);

LinkList createList_1(LinkList &L)
{
    LNode *s;
    int inp_data;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    cin>>inp_data;
    while(inp_data != 9999)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data = inp_data;
        s->next = L->next;
        L->next = s;
        cin>>inp_data;
    }
    return L;
}

LinkList createList_2(LinkList &L)
{
    int inp_data;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    //(LNode)pointer is the pointer to the last one in the list. Primary pointing to L;
    LNode *s, *e = L;
    cin>>inp_data;
    while(inp_data != 9999)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data = inp_data;
        s->next = NULL;
        e->next = s;
        e = s;
        cin>>inp_data;
    }
    e->next = NULL;
    return L;
}

int getElement(LinkList &L, int i)
{
    LNode *p;
    if(i < 1 || i > getLength(L)) return 9999;
    p = L->next;
    while(--i)
    {
        p = p->next;
    }
    return p->data;
}

int getLength(LinkList &L)
{
    LNode *p;
    int cnt = 0;
    if(L->next == NULL) return 0;
    p = L->next;
    while(p != NULL)
    {
        cnt++;
        p = p->next;
    }
    return cnt;
}

void printList(LinkList &L)
{
    LNode *p;
    if(L->next == NULL) return;
    p = L->next;
    while(p != NULL)
    {
        cout<data<<"->";
        p = p->next;
    }
    cout<<"end"<int val, int i)
{
    LNode *p, *pev, *s;
    if(i < 1 || i > getLength(L) + 1) return false;
    p = L->next;
    pev = L;
    while(--i)
    {
        pev = pev->next;
        p = p->next;
    }
    s = (LinkList)malloc(sizeof(LNode));
    s->data = val;
    pev->next = s;
    s->next = p;
    return true;
}

int deleteNode(LinkList &L, int i)
{
    LNode *p, * pev;
    int retdata;
    if(i < 1 || i > getLength(L) + 1) return 9999;
    p = L->next;
    pev = L;
    while(--i)
    {
        pev = pev->next;
        p = p->next;
    }
    pev->next = p->next;
    retdata = p->data;
    free(p);
    return retdata;
}

int main()
{
    LNode *L;
    cout<<"Please input the elemenets and end with '9999'."
    LinkList linkList = createList_2(L);
    printList(L);
    insertNode(L,100,2);
    printList(L);
    deleteNode(L,5);
    printList(L);
    return 0;
}

运行结果

howard@howard-Lenovo-G40-45:~/Desktop$ g++ LinkList.cpp -o test
howard@howard-Lenovo-G40-45:~/Desktop$ ./test
1 2 3 4 5 9999
1->2->3->4->5->end
1->100->2->3->4->5->end
1->100->2->3->5->end

你可能感兴趣的:(C++,数据结构与算法,单链表,c语言,malloc,数据结构)