C++之一个程序学懂链表

来源:互联网 发布:如何查看电脑的端口号 编辑:程序博客网 时间:2024/06/05 12:02

本人最近正在学习数据结构,链表涉及较多,因此写了一个小程序帮助自己理解。代码注释较多,直接阅读难度应该不大,它涵盖了链表的读入、输出、反序、排序、插入、查找、删除等操作。大家若能读完、看懂,相信对单向链表掌握得已经不错了。希望能够帮到大家!


#include <bits/stdc++.h>
#define LEN sizeof(struct num)
int m;
using namespace std;
struct num
{
    int n;
    struct num *next;
};


//创立链表,读入数据
struct num *Create()
{
    m = 0;
    struct num *head;       //头节点
    struct num *p1 = NULL;  //p1保存创建的新节点的地址
    struct num *p2 = NULL;  //p2保存原链表最后一个节点的地址
    p1 = (struct num *) malloc (LEN);
    p2 = p1;
    if(p1==0)        //若节点开辟不成功
    {
        printf ("\nCann't create it, try it again in a moment!\n");
        return 0;
    }
     else                //节点开辟成功
    {
        head = NULL;        //开始head指向NULL
        printf ("Please input %d node -- n: ", m + 1);
        scanf ("%d", &(p1->n));    //录入数据
    }
    while(p1->n!=0)
    {
        m = m + 1;
        if(m==1)
        {
            head = p1;
            p2->next = NULL;
        }
        else
        {
            p2->next = p1;
        }
        p2=p1;
        p1 = (struct num *)malloc(LEN);
        cout<<"Please input "<<m+1<<" node -- n: ";
        cin>>p1->n;
    }
    p2->next=NULL;
    free(p1);
    return head;
}


//遍历链表


void Print(num *head)
{
    num *p = head;
    cout<<"The numbers are: "<<endl;
    while(p != NULL)
    {
        cout<<p->n<<endl;
        p = p->next;
    }
}


//按升序排序
struct num *Ascending(struct num *head)
{
    cout<<"Ascending: "<<endl;
    struct num *p = NULL;
    int a[m+1], i;
    p = head;
    if(head!=NULL)
    {
            for(i = 0; i<m; i++)
            {
                a[i]=p->n;
                p = p->next;
            }
    }
    sort (a,a+m);//快速排序法
    i = 0;
    p = head;
    while(i<m)
    {
       p->n = a[i];
       p = p->next;
       i++;
    }
    return head;
};






struct num *Insert(struct num *head)
{
    struct num *p0, *p1, *p2;
    p1 = head;
    int n;
    p2 = p1;
    p0 = (struct num *)malloc(LEN);
    cout<<"Please input the number you want to insert: ";
    cin>>n;
    p0->n = n;
    while (p0->n > p1->n && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }


    if (p0->n <= p1->n)
    {
        if (p1 == head)
        {// 头部前段插入 p0和p1位置: p0->p1->...
            p0->next = head;
            head = p0;
        }
        else
        {// 插入中间节点 p0,p1和p2位置: p2-> p0 -> p1
            p0->next = p1;
            p2->next = p0;
        }
    }
    else
    {   // 尾部插入节点 p0,p1和p2位置: p2->p1->p0->NULL
        p1->next = p0;
        p0->next = NULL;
    }
     return head;
}




//查找元素
void Search(struct num *head)
{
    cout<<"Please input the number you want to search: "<<endl;
    int n, flag = 0;
    cin>>n;
    struct num *p = NULL;
    p = head;
    do
    {
       if(p->n == n)
       {
           cout<<"Your number exsits. "<<endl;
           flag = 1;
       }
       p = p->next;
    }while(p!=NULL);
    if(!flag) cout<<"Your number doesn't exsit. "<<endl;
};


//删除指定元素
struct num *Delete(struct num *head)
{
    cout<<"Please input the number you want to delete: "<<endl;
    int n, flag = 0;
    cin>>n;
    struct num *p2 = NULL;
    struct num *p1 = NULL;
    p2 = head;
    while(p2!=NULL)
    {
        if(head->n == n)
        {
            head = p2->next;
            flag = 1;
            free(p2);
            p2 = NULL;
            break;
        }
        else if(p2->n == n)
        {
            p1->next = p2->next;
            flag = 1;
            free(p2);
            p2 = NULL;
            break;
        }
        p1 = p2;
        p2 = p2->next;
    }


    if(flag==0)
        cout<<"Your number doesn't exsit."<<endl;


    m = m - 1;
    return head;
};


//将链表逆序
struct num *Reverse (struct num *head)
{
    struct num *p;      //临时存储
    struct num *p1;     //存储返回结果
    struct num *p2;     //源结果节点一个一个取


    p1 = NULL;          //开始颠倒时,已颠倒的部分为空
    p2 = head;          //p2指向链表的头节点
    while(p2 != NULL)
    {
        p = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = p;
    }
    head = p1;
    return head;
}


int main()
{
   struct num *head;


   head = Create();//创立链表,读入数据
   Print(head);


   Ascending(head);//按升序排序
   Print(head);


   Search(head);//查找指定元素


   head = Delete(head);//删除指定元素
   Print(head);


   head = Insert(head);//插入指定元素
   Print(head);


   head = Reverse(head);//将链表逆序
   Print(head);


}




1 0
原创粉丝点击