如何实现按名字首字母排序的冒泡排序

我在通讯录基础上加了一个冒泡排序,数据存储在链表里的,怎么完成排序功能

#include<stdio.h>
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<math.h>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<list>
using namespace std;
typedef struct              //结构定义
{
    int number;              //联系人序号
    char name[50];          //联系人姓名
    char phone[50];         //电话号码 
    char address[50];       //手机号码
    char mail[50];          //邮箱
}
Datatype,*Data;
typedef struct node
{ 
    int length;
    Datatype data;          //结点数据域
    struct node *next;      //节点的指针域
}Listnode,*Linklist;
Linklist q;
Linklist l = (Linklist)malloc(sizeof(Listnode));     //链表头节点,分配内存 

void menu()
{
    cout << "                    ——————————————————" << endl;
    cout << "                   |       欢迎进入通讯录管理系统       |" << endl;
    cout << "                   |                                                 |" << endl;
    cout << "                   |                                    |" << endl;
    cout << "                   |          1 录入联系人信息          |" << endl;
    cout << "                   |          2 输出联系人信息          |" << endl;
    cout << "                   |          3 查询联系人信息          |" << endl;
    cout << "                   |          4 修改联系人信息          |" << endl;
    cout << "                   |          5 删除联系人信息          |" << endl;
    cout << "                   |          6 插入联系人信息          |" << endl;
    cout << "                   |          7 退出通讯录管理系统      |" << endl;
    cout << "                   |                                    |" << endl;
    cout << "                    ——————————————————" << endl;
    cout << endl;
    cout << endl;
    cout << "请选择要操作的选项:";
}
void initlist(Linklist &l)//构建一个空的链表
{
    Listnode * p;           
    p = (Listnode *)malloc(sizeof(Listnode));
    p->next = NULL;
    l = p;
}
void write(Linklist &l)//录入联系人信息
{
    int n;
    printf("请输入要录入的联系人人数:");
    scanf("%d", &n);
    l->next = NULL;
    l->length = n;
    Listnode *rear = l;
    for (int i = 1; i <= n; i++)
    {
        Listnode *p = (Listnode *)malloc(sizeof(Listnode));
        p->data.number= i;
        printf("第%d位员工的信息:\n", p->data.number);
        printf("姓名:");
        scanf("%s", p->data.name);
        printf("电话号码:");
        scanf("%s", p->data.phone);
        printf("地址:"); 
        scanf("%s", p->data.address); 
        printf("电子邮件:");
        scanf("%s", p->data.mail);
        p->next = NULL;
        rear->next = p;
        rear = p;
    }
}
void Bubblesort(Linklist &l)
{
    int j ,exchange,bound,temp;
    exchange=l->length-1;
    Listnode * p = l->next;
    p->data=data[j];
    while(exchange!=0)
    {
        bound=exchange;
        exchange=0;
        for(j=0;j<bound;j++)
            if (strcmp(data[j].name, data[j+1].name)>0)
            {
                temp=data[j].name;
                data[j].name=data[j+1].name;
                data[j+1].name=temp;
                exchange=j;    
            }
    } 
}
void show(Linklist p)//显示一个联系人信息
{
    if (p != NULL)
    {
        cout << "[" << p->data.number << "]";
        cout << "姓名:" << std::left << setw(35) << p->data.name;
        cout << "电话号码:" << std::left << setw(35) << p->data.phone << endl;
        cout << "   地址:" << std::left << setw(35) << p->data.address;
        cout << "电子邮件:" << std::left << setw(35) << p->data.mail << endl;
    }
}
void display(Linklist l)//输出通讯录 
{
    Listnode *p = l->next;
    int n = 0;
    if (l->next == NULL)
    {
        cout << "当前并此联系人信息!" << endl;
    }
    else
    {
        for (int i = 1,temp=0; i <= l->length; i++)
        {
            cout << "[" << p->data.number << "]";
            cout << "姓名:" << std::left << setw(35) << p->data.name;
            cout << "电话号码:" << std::left << setw(35) << p->data.phone << endl;
            cout << "   地址:" << std::left << setw(35) << p->data.address;
            cout << "电子邮件:" << std::left << setw(35) << p->data.mail << endl;
            p = p->next;
        }
    }
}
void find(Linklist l)//按姓名查找联系人信息
{
    char id[50];
    printf("请输入需要查询的联系人姓名:");
    scanf("%s",id);
    Listnode * p = l;
    if (p->next ==NULL)
    {
        printf("查询无此联系人信息!\n");
    }
    else
    {
        for (int j = 0; p != NULL&&strcmp(p->data.name, id) != 0 && j <= l->length; j++)/*strcmp用来比较两个编号是否相同*/
        {
            p = p->next;
        } 
        if (p == NULL || (p->next == NULL&&p == l))
        {
            printf("查询无此联系人信息!\n");
        }
        else
        {
            show(p);
        }
    }
}
void update(Linklist &l)//修改联系人信息
{
    char id[50];
    printf("\n请输入需要修改的联系人姓名:");
    scanf("%s",id);
    Listnode * p = l->next;
    if (p == NULL)
    {
        printf("查询无此联系人信息,无法修改!\n");
    }
    else
    {
        for (int j = 1; (p != l) && (p->next != NULL) && (strcmp(p->data.name, id) != 0) && (j <= l->length); j++)/*strcmp用来比较两个编号是否相同*/
        {
            p = p->next;
        }
        if (p == NULL || (p->next == NULL&&p == l))
        {
            printf("查询无此联系人信息,无法修改!\n");
        }
        else
        {
            show(p);
            printf("\n请修改该联系人信息:\n");
            printf("姓名:");
            scanf("%s", p->data.name);
            printf("电话号码:");
            scanf("%s", p->data.phone);
            printf("地址:");
            scanf("%s", p->data.address);
            printf("电子邮件:");
            scanf("%s", p->data.mail);
            printf("\n修改成功!\n");
        }
    }
}
bool remove(Linklist &l)//删除联系人信息 
{
    char id[50];
    printf("请输入需要删除的联系人姓名:");
    scanf("%s",id);
    if (l->next == NULL)
    {
        printf("查询无此联系人信息,无法删除!");
        return false;
    }
    Listnode * p = l->next;
    Listnode * s = p;
    for (int j = 1; (p != NULL) && (p != l) && (p->next != NULL) && (strcmp(p->data.name, id) != 0) && (j <= l->length); j++)//strcmp用来比较两个序号是否相同
    {
        s = p;
        p = p->next;
    }
    if (p==l)
    {
        printf("查询无此联系人信息,无法删除!");
        return false;
    }
    else
    {
        show(p);
        Listnode * q = p->next;
        s->next = q;
        l->length--;
        if (p == l->next&&p->next == NULL)
        {
            ;
        }
        else
        {
            for (; p != NULL; p = p->next)
            {
                p->data.number--;
            }
        }
        free(p);
        return true;
    }
}
bool insert(Linklist &l)//添加联系人信息
{
    Listnode *p = l;
    if (l->length == 0)
    {
        p = l;
    }
    else
    {
        while (p->next != NULL)
        {
            p = p->next;
        }
    }
    if (p==l||p->next == NULL)
    {
        Listnode * s = (Listnode *)malloc(sizeof(Listnode));
        l->length++;
        printf("输入新增联系人信息:\n");
        s->data.number = l->length;
        printf("第%d位联系人的信息:\n", s->data.number);
        printf("姓名:");
        scanf("%s", s->data.name);
        printf("电话号码:");
        scanf("%s", s->data.phone);
        printf("地址:");
        scanf("%s", s->data.address);
        printf("电子邮件:");
        scanf("%s", s->data.mail);
        p->next = s;
        s->next = NULL;
        return true;
    }
    else
    {
        printf("当前信息为空,请执行第一步之后重试!\n");
        return false;
    }
}

void exit()
{
    cout << "            —————————————————" <<endl;
    cout << "           |                                  |"<<endl;
    cout << "           |           感谢您的使用!         |"<<endl;
    cout << "           |                                  |"<<endl;
    cout << "            —————————————————" <<endl;
    cout << endl;
}
int main()
{
    string order;
    l->next = NULL;
    l->length = 0;
    char*end;//末端指针/ 
    menu();
    while (cin>>order)
    {
        int a_order = static_cast<int>(strtol(order.c_str(), &end, 10));//将输入进来的值转化为int类型
        switch (a_order + 48)
        {
        case'1':
        {

                   write(l);//录入联系人信息 
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'2':
        {
                   display(l);//输出整个通讯录 
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'3':
        {
                   find(l);//查询联系人信息
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'4':
        {
                   update(l);//修改联系人信息
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'5':
        {
                   bool falg5 = remove(l);//删除联系人信息
                   if (falg5)
                   {
                       printf("成功删除联系人信息!\n");
                   }
                   else
                   {
                       printf("删除联系人信息失败!\n");
                   }
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'6':
        {
                   bool falg6 = insert(l);//添加联系人信息
                   if (falg6)
                   {
                       printf("添加联系人信息成功!\n");
                   }
                   else
                   {
                       printf("添加员工信息失败!\n");
                   }
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        case'7':
        {
                   system("cls");
                   exit();
                   return 0;
                   break;
        }
        default:
        {
                   cin.clear();
                   cin.sync();
                   cout << "输入错误,重新返回主界面。" << endl;
                   system("pause");
                   system("cls");
                   menu();
                   break;
        }
        }
    }
    return 0;
}

从84行开始