注意头插法和尾插法区别;

头指针指向链表中第一个结点(头结点也是第一个结点);

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
typedef struct Mnode
{
    int data;
    struct Mnode *next;
}Node, *Linklist;
void CreatListHead(Linklist &L, int n)   // 头插法; Linklist &L
{
    int m;
    L = (Linklist)malloc(sizeof(Mnode));
    L->next = NULL;
    for(int i = 0; i < n; i++)
    {
        Linklist p;
        scanf("%d", &m);
        p = (Linklist)malloc(sizeof(Mnode));
        p->data = m;
        p->next = L->next;
        L->next = p;
    }
}
void PrintfList(Linklist &Q)
{
    Linklist p = Q;
    p = p->next;    //指向第一个结点;
    while(p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
}
void CreatListTail(Linklist &L, int n)  //尾插法
{
    Linklist r, p;
    L = (Linklist)malloc(sizeof(Mnode));
    r = L;                             //醉醉的;
    for(int i = 0; i < n; i++)
    {
        int m;
        p = (Node *)malloc(sizeof(Mnode));
        scanf("%d", &m);
        p->data = m;
        r->next = p;
        r = p;
    }
    r->next = NULL;
}
bool ListInsert(Linklist &L, int pos, int n)  //在位置pos处插入一个元素n;
{
    Linklist q, p, Q;
    int j = 1;
    p = L;
    while(p->next && j < pos)
    {
        ++j;
        p = p->next;
    }
    if(!(p->next) || j > pos)
        return false;
    q = (Linklist)malloc(sizeof(Mnode));
    q->data = n;
    q->next = p->next;
    p->next = q;
    return true;
}
bool GetElem(Linklist &L, int pos, int *e)
{
    int j = 1;
    Linklist p;
    p = L;
    while(p->next && j < pos)
    {
        ++j;
        p = p->next;
    }
    if(!(p->next) || j > pos)
        return false;
    else
        printf("%d\n", p->next->data);
    return true;
}
bool ListDelete(Linklist &L, int pos, int *e)  //删除链表中第pos个元素;
{
    int j = 1;
    Linklist p, q;
    p = L;
    while(j < pos && p->next)  //j==i时其实刚好判断完目标结点的前一个节点;
    {
        ++j;
        p = p->next;
    }
    if(!(p->next) || j > pos)
        return false;
    q = p->next;
    e = &(q->data);
    //p->next = p->next->next;
    p->next = q->next;
    return true;
}
void ClearList(Linklist &L)  //清空链表;
{
    Linklist q, p;
    p = L->next;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L->next = NULL;
}
void UnionList(Linklist &L, Linklist &M)
{
    Linklist p, q;
    p = L->next;
    while(p)
    {
        p = p->next;
    }
    q = M->next;
    p->next = q;
  //  free[M];
}
Linklist Q;  int posi;
void Operator()
{
    int m, n;
    scanf("%d", &n);
    switch(n)
    {
        case 1:
            printf("创建单链表(头插法):\n");
            scanf("%d", &m);
            CreatListHead(Q, m);
            break;
        case 2:
            printf("创建单链表Q(尾插法):\n");
            int d;
            scanf("%d", &d);
            CreatListTail(Q, d);
            break;
        case 3:
            printf("查找元素是否存在\n");
            int *b;
            scanf("%d", &posi);
            GetElem(Q, posi, b);
            break;
        case 4:
            printf("插入元素\n");
            int K;
            scanf("%d%d", &posi, &K);
            ListInsert(Q, posi, K);
            break;
        case 5:
            printf("删除元素\n");
            int *e;
            scanf("%d", &posi);
            ListDelete(Q, posi, e);
            PrintfList(Q);
            break;
        case 6:
            printf("输出链表元素\n");
            PrintfList(Q);
            break;
        case 7:
            printf("合并链表");
//            UnionList(p, Q);
            break;
        case 8:
            printf("清空链表\n");
            ClearList(Q);
            break;
    }
    Operator();
}
int main()
{
    Operator();
    return 0;
}

 

posted on 2016-01-02 23:49  cleverbiger  阅读(176)  评论(0)    收藏  举报