数据结构——线性表

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef int Status;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LENGTH 10
typedef struct Elemtype
{
    char *name;
    char *number;
    int age;
}Elemtype;

typedef struct
{
    Elemtype *elem;
    int cnt;
    int length;
}Lnode_sq, *List_sq;


typedef struct Lnode_link
{
    Elemtype *elem;
    struct Lnode_link *pnext;

}Lnode_link,*List_link;


Lnode_sq P_List_sq;
Lnode_link Link_List;

Status is_empty_Listsq(List_sq List_sq)
{
    if(List_sq->cnt == 0)
        return TRUE;
    else    
        return FALSE;
}

Status is_full_Listsq(List_sq List_sq)
{
    if(List_sq->length == List_sq->cnt)
        return TRUE;
    else
        return FALSE;
}

Status Init_List_sq(List_sq L, int length)
{
    L->elem = (Elemtype *)malloc(sizeof(Elemtype)*length);
    if(L->elem == NULL)
        exit(OVERFLOW);
    else
    {
        L->length = length;
        L->cnt = 0;
        return OK;
    }    

}

Status List_Sq_length(List_sq List_sq)
{
    return List_sq->cnt;
}

Status Get_List_sq(List_sq List_sq, int pos, Elemtype *elem)
{
    if(is_empty_Listsq(List_sq))
    {
        return ERROR;
    }
    if(pos<1||pos>List_sq->cnt)
    {   
        return ERROR;
    }
   // elem->name = (char *)malloc(sizeof(char)*LENGTH);
    //elem->number = (char *)malloc(sizeof(char)* LENGTH);
    {
        elem->name = List_sq->elem[pos-1].name;
        elem->number = List_sq->elem[pos-1].number;
        elem->age = List_sq->elem[pos-1].age;
        return OK;
    }

}

Status Locate_List_sq(List_sq List_sq, char **name)
{
    if(is_empty_Listsq(List_sq))
    {
        return ERROR;
    }
    else
    {
        for(int i=0; i<List_sq->cnt; i++)
        {
            if(strcmp(List_sq->elem[i].name,*name) == 0)
            {
                return i+1;
            }

        }
        return ERROR;

    }
}

Status Insert_List_sq(List_sq List_sq, int pos, Elemtype *elem)
{
    if(is_full_Listsq(List_sq))
    {
        return ERROR;
    }
    if(pos<1||pos>List_sq->cnt+1)
    {   
        return ERROR;
    }
    elem->name = (char *)malloc(sizeof(char)*20);
    elem->number = (char *)malloc(sizeof(char)*20);
    printf("请输入你要插入元素的名字:");
    scanf("%s",elem->name);
    printf("请输入你要插入元素的学号: ");
    scanf("%s",elem->number);
    printf("请输入你要插入元素的年龄: ");
    scanf("%d",&elem->age);
    if(pos<List_sq->cnt+1)
    {
        for(int i=List_sq->cnt-1;i>=pos-1;i--)
        {
            List_sq->elem[i+1].name = List_sq->elem[i].name;
            List_sq->elem[i+1].number = List_sq->elem[i].number;
            List_sq->elem[i+1].age = List_sq->elem[i].age;
            
        }

    }
    List_sq->elem[pos-1].name = elem->name;
    List_sq->elem[pos-1].number =elem->number;
    List_sq->elem[pos-1].age = elem->age;
    List_sq->cnt++;
    return OK;
}

Status Delete_Listsq(List_sq List_sq, int pos, Elemtype *elem)
{
    if(is_empty_Listsq(List_sq))
    {
        return ERROR;
    }
    if(pos<1||pos>List_sq->cnt)
    {
        return ERROR;
    }
    elem->name = List_sq->elem[pos-1].name;
    elem->number = List_sq->elem[pos-1].number;
    elem->age = List_sq->elem[pos-1].age;
    if(pos<List_sq->cnt)
    {
        for(int i=pos; i<List_sq->cnt;i++)
        {
            List_sq->elem[i-1].name = List_sq->elem[i].name;
            List_sq->elem[i-1].number = List_sq->elem[i].number;
            List_sq->elem[i-1].age = List_sq->elem[i].age;
        }
    }
    
    List_sq->cnt--;
    return OK;
}

Status Traverse_Listsq(List_sq List_sq)
{
    if(is_empty_Listsq(List_sq))
    {
        return ERROR;
    }
    else
    {
        for(int i=0;i<List_sq->cnt;i++)
        {
            printf("\t\t\t\t\t\t   %s   ",List_sq->elem[i].name);
            printf("\t\t\t\t\t\t   %s   ",List_sq->elem[i].number);
            printf("\t\t\t\t\t\t   %d   ",List_sq->elem[i].age);
            printf("\n");
        }
    }
    return OK;
}

void p1(void)
{
    int status;
    status = Init_List_sq(&P_List_sq,LENGTH);
    if(status == OVERFLOW)
    {
        system("cls");
        printf("\t\t\t\t\t\t线性表创建失败!\n");
        printf("\t\t\t\t");
        system("pause");
    }
    else
    {
        system("cls");
        printf("线性表创建成功!\n");
        printf("\t\t\t\t\t");
        system("pause");
    }

}

void p2(void)
{
   int length;
   length = List_Sq_length(&P_List_sq);
   system("cls");
   printf("\t\t\t\t\t\t顺序线性表的长度为: %d\n",length);
   printf("\t\t\t\t");
   system("pause");
}

void p3(void)
{
    int pos,status;
    Elemtype elem3;
    // elem->name = (char *)malloc(20);
    // elem->number = (char *)malloc(20);
    system("cls");
    switch(P_List_sq.cnt)
    {
        case 0:
            printf("\t\t\t\t\t顺序表长度为0无法取值,请先插入元素!\n");
            printf("\t\t\t\t\t");
            system("pause");
            break;
        default:
            printf("\t\t\t\t请输入你要获取的元素的位置: ");
            scanf("%d",&pos);
            status = Get_List_sq(&P_List_sq,pos,&elem3);
            if(status == ERROR)
            {
                printf("所输入位置的元素不存在!\n");
                printf("\t\t\t\t");
                system("pause");
            }
            else
            {
                printf("\t\t\t\t所输入位置元素的名字为: %s\n",elem3.name);
                printf("\t\t\t\t所输入位置元素的学号为: %s\n",elem3.number);
                printf("\t\t\t\t所输入位置元素的年龄为: %d\n",elem3.age);
                printf("\t\t\t\t");
                system("pause");
            }
            break;
    }

}

void p4(void)
{
    char *name;
    int status;
    name = (char *)malloc(sizeof(char)*LENGTH);
    system("cls");
    switch(P_List_sq.cnt)
    {
        case 0:
            
            printf("\t\t\t\t\t\t顺序表长度为空无法查找,请先插入元素!\n");
            printf("\t\t\t\t\t");
            system("pause");
            break;
        default:
            printf("\t\t\t\t\t请输入你要查找元素的姓名:");
            scanf("%s",name);
            printf("%s",name);
            status = Locate_List_sq(&P_List_sq,&name);
            if(status == ERROR)
            {
                printf("\t\t\t\t不存在该姓名的元素!\n");
                printf("\t\t\t\t");
                system("pause");

            }
            else
            {
                printf("\t\t\t第一个为该姓名的元素位置为%d\n",status);
                printf("\t\t\t\t");
                system("pause");
            }
    }

}

void p5(void)
{
    system("cls");
    int status,pos;
    Elemtype elem;
    printf("\t\t\t\t\t请输入你要插入的位置:");
    scanf("%d",&pos);
    status = Insert_List_sq(&P_List_sq,pos,&elem);
    if(status == ERROR)
    {
        printf("\t\t\t\t\t顺序表中元素已满或者你输入的插入位置不合法\n");
        printf("\t\t\t\t\t\t");
        system("pause");

    }
    else
    {
        printf("\t\t\t\t\t插入成功!\n");
        printf("\t\t\t\t\t\t");
        system("pause");
    }
}

void p6(void)
{
    char *name;
    int a;
    int pos;
    Elemtype elem;
    name = (char *)malloc(sizeof(char) * LENGTH);
    elem.name = (char *)malloc(sizeof(char) * LENGTH);
    elem.number = (char *)malloc(sizeof(char) * LENGTH);
    system("cls");
    printf("\t\t\t\t\t\t请输入你的选择(1:位置删除, 2:姓名删除)");
    scanf("%d",&a);
   // system("cls");
    if(a == 1)
    {
        printf("\n");
        printf("\t\t\t\t\t\t请输入你要删除的元素的位置:");
        scanf("%d",&pos);
        Delete_Listsq(&P_List_sq,pos,&elem);
        printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
        printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
        printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
        printf("\t\t\t\t\t\t删除成功!\n");

    }
    if(a == 2)
    {
        printf("\n");
        printf("\t\t\t\t\t\t请输入你要删除的元素的姓名:");
        scanf("%s",name);
        pos = Locate_List_sq(&P_List_sq,&name);
        if(pos == ERROR)
        {
            printf("\t\t\t\t\t\t你要删除的姓名为%s的元素不存在!\n",name);
            printf("\t\t\t\t\t\t删除失败!\n");
        }
        else
        {
            printf("\t\t\t\t\t\t你要删除的姓名为%s的元素的位置为%d\n",name,pos);
            Delete_Listsq(&P_List_sq,pos,&elem);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
            printf("\t\t\t\t\t\t删除成功!\n");
        }
         
    }
        //printf("\t\t\t\t\t插入成功!\n");
        printf("\t\t\t\t\t\t");
        system("pause");
    
}

void p7(void)
{
    system("cls");
    if(is_empty_Listsq(&P_List_sq))
    {
        printf("\t\t\t\t\t\t\t顺序表中无元素,无法输出!\n");

    }
    else
    {
        printf("\t\t\t\t\t\t\t顺序表中的元素输出如下: \n");
        Traverse_Listsq(&P_List_sq);
    }
    printf("\t\t\t\t\t\t");
    system("pause");
    
}
void list_sq_show(void)
{
    int b;

    while(1)
    {
        system("cls");

        printf("\t\t\t\t\t\t\t\t1: 创建顺序线性表\n");
        printf("\t\t\t\t\t\t\t\t2: 求顺序线性表的长度\n");
        printf("\t\t\t\t\t\t\t\t3: 按序号取顺序表元素\n");
        printf("\t\t\t\t\t\t\t\t4: 按值查找顺序表\n");
        printf("\t\t\t\t\t\t\t\t5: 插入元素\n");
        printf("\t\t\t\t\t\t\t\t6: 删除元素\n");
        printf("\t\t\t\t\t\t\t\t7: 输出顺序线性表\n");
        printf("\t\t\t\t\t\t\t\t8: 返回\n");
        printf("\t\t\t\t\t\t\t\t请输入你的选择: ");
        scanf("%d",&b);

        if(b == 8)
        {
            break;
        }
        else
        {
            switch(b)
            {
                case 1:p1(); break;
                case 2:p2(); break;
                case 3:p3(); break;
                case 4:p4(); break;
                case 5:p5(); break;
                case 6:p6(); break;
                case 7:p7(); break;
                default: 
                        printf("\t\t\t\t输入错误\n");
                         printf("\t\t\t\t");
                         system("pause");
                         break;
            }

        }
        
    }

}

Status is_empty_link(List_link Link_List)
{
    if(Link_List->pnext == NULL)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }

}

Status init_List_lk(List_link Link_List)
{
    Link_List = (List_link )malloc(sizeof(Lnode_link));
    if(Link_List == NULL)
    {
        return ERROR;
    }
    else
    {
         Link_List->pnext = NULL;
         return OK;
    }

}

Status LkList_Length(List_link Link_List)
{
    int j=0;
    List_link p = Link_List->pnext;
    while(p)
    {
        p=p->pnext;
        ++j;
    }
    return j;
}

Status Get_elem_Lklist(List_link Link_List, int pos, Elemtype *elem)
{
    List_link p=Link_List->pnext;
    int j=1;
 
    while(p&&j<pos)
    {
        p=p->pnext;
        j++;
    }
    if(!p||j>pos)
    {
        return ERROR;
    }
   
    elem->name = p->elem->name;
    elem->number = p->elem->number;
    elem->age = p->elem->age;
    return OK;
    
}

Status Locate_List_lk(List_link Link_List, char **name)
{
    List_link p = Link_List->pnext;
    int j=1;
    while(p&&(strcmp(p->elem->name,*name)!=0))
    {
        p=p->pnext;
        j++;
    }
    if(!p)
    {
        return ERROR;
    }
    else
    {
        return j;
    }
}

Status Insert_Listlk(List_link Link_List, int pos, Elemtype *elem)
{
    List_link p = Link_List;
    List_link s;
    int j = 0;
    while(p&&(j<pos-1))
    {
        p=p->pnext;
        ++j;
    }
    if(!p||j>pos-1)
    {
        return ERROR;
    }
    elem->name = (char *)malloc(sizeof(char) * LENGTH);
    elem->number = (char *)malloc(sizeof(char) * LENGTH);
    s = (List_link)malloc(sizeof(Lnode_link));
    s->elem = (Elemtype *)malloc(sizeof(Elemtype));
    s->elem->name = (char *)malloc(sizeof(char) * LENGTH);
    s->elem->number = (char *)malloc(sizeof(char) * LENGTH);

    printf("请输入你要插入元素的姓名:");
    scanf("%s",elem->name);
    printf("请输入你要插入元素的学号: ");
    scanf("%s",elem->number);
    printf("请输入你要插入元素的年龄: ");
    scanf("%d",&elem->age);
    s->elem->name = elem->name;
    s->elem->number = elem->number;
    s->elem->age = elem->age;
    s->pnext = p->pnext;
    p->pnext = s;
    return OK;
}

Status Delete_LkList(List_link Link_List, int pos, Elemtype *elem)
{
    List_link p=Link_List;
    List_link q;
    int j=0;
    while((p->pnext)&&(j<pos-1))
    {
        p=p->pnext;
        ++j;
    }
    if(!(p->pnext)||(j>pos-1))
    {
        return ERROR;
    }
    q = p->pnext;
    elem->name = q->elem->name;
    elem->number = q->elem->number;
    elem->age = q->elem->age;
    p->pnext = q->pnext;
    free(q);
    q = NULL;
    return OK;

}

Status Traverse_LkList(List_link Link_List)
{
    List_link p=Link_List->pnext;
    while(p)
    {
        printf("\t\t\t\t  %s\t\t\t\t%s\t\t\t\t%d\n",p->elem->name,p->elem->number,p->elem->age);
        p = p->pnext;

    }
    return  OK;
}

void q1(void)
{
    int status;
    status = init_List_lk(&Link_List);
    if(status == ERROR)
    {
        system("cls");
        printf("\t\t\t\t\t\t链式线性表创建失败!\n");
        printf("\t\t\t\t");
        system("pause");
    }
    else
    {
        system("cls");
        printf("链式线性表创建成功!\n");
        printf("\t\t\t\t\t");
        system("pause");
    }

}

void q2(void)
{
   int length;
   length = LkList_Length(&Link_List);
   system("cls");
   printf("\t\t\t\t\t\t链式线性表的长度为: %d\n",length);
   printf("\t\t\t\t");
   system("pause");
    
}

void q3(void)
{
    int pos,status;    
    Elemtype elem;
    system("cls");
    printf("\t\t\t\t\t\t请输入你要获取链表元素的位置: ");
    scanf("%d",&pos);
    status = Get_elem_Lklist(&Link_List,pos,&elem);
    if(status == ERROR)
    {
        printf("\t\t\t\t\t\t你输入的位置不合法!\n");
        
    }
    else
    {
        printf("\t\t\t\t\t\t你输入位置的元素的姓名为: %s\n", elem.name);
        printf("\t\t\t\t\t\t你输入位置的元素的学号为: %s\n", elem.number);
        printf("\t\t\t\t\t\t你输入位置的元素的年龄为: %d\n", elem.age);
        
    }
    printf("\t\t\t\t\t\t\t");
    system("pause");
}

void q4(void)
{
    char *name;
    Elemtype elem;
    int pos;
    system("cls");
    printf("请输入你要查找元素的姓名: ");
    scanf("%s",name);
    pos = Locate_List_lk(&Link_List, &name);
    if(pos == ERROR)
    {
        printf("\t\t\t\t\t\t链式顺序表中没有你输入姓名的元素!\n");

    }
    else
    {
        Get_elem_Lklist(&Link_List,pos,&elem);
        printf("\t\t\t\t\t\t你要获取的姓名为%s的元素位置是%d\n",name,pos);
        printf("\t\t\t\t\t\t你要获取的姓名为%s的元素学号是%s\n",name,elem.number);
        printf("\t\t\t\t\t\t你要获取的姓名为%s的元素年龄是%d\n",name,elem.age);

    }
    printf("\t\t\t\t\t\t\t\t");
    system("pause");

}

void q5(void)
{
    system("cls");
    int status,pos;
    Elemtype elem;
    printf("\t\t\t\t\t请输入你要插入的位置:");
    scanf("%d",&pos);
    status = Insert_Listlk(&Link_List,pos,&elem);
    if(status == ERROR)
    {
        printf("\t\t\t\t\t你输入的插入位置不合法\n");
        printf("\t\t\t\t\t\t");
        system("pause");

    }
    else
    {
        printf("\t\t\t\t\t插入成功!\n");
        printf("\t\t\t\t\t\t");
        system("pause");
    }
    
}

void q6(void)
{
    int a,status,pos;
    char *name;
    Elemtype elem;
    name = (char *)malloc(sizeof(char) * LENGTH);
    elem.name = (char *)malloc(sizeof(char *) * LENGTH);
    elem.number = (char *)malloc(sizeof(char *) * LENGTH);
    system("cls");
    printf("请输入你的选择(1-2)1:位置删除, 2:姓名删除: ");
    scanf("%d",&a);
    if(a == 1)
    {
        
        printf("\n");
        printf("\t\t\t\t\t\t请输入你要删除的元素的位置:");
        scanf("%d",&pos);
        status = Delete_LkList(&Link_List,pos,&elem);
        if(status == ERROR)
        {
            printf("\t\t\t\t\t\t你要删除的位置不合法!\n");
        }
        else
        {
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
            printf("\t\t\t\t\t\t删除成功!\n");
        }
       
    }
    if(a ==2)
    {
        printf("\n");
        printf("\t\t\t\t\t\t请输入你要删除的元素的姓名:");
        scanf("%s",name);
        pos = Locate_List_lk(&Link_List,&name);
        if(pos == ERROR)
        {
            printf("\t\t\t\t\t\t你要删除的姓名为%s的元素不存在!\n",name);
            printf("\t\t\t\t\t\t删除失败!\n");
        }
        else
        {
            printf("\t\t\t\t\t\t你要删除的姓名为%s的元素的位置为%d\n",name,pos);
            Delete_LkList(&Link_List,pos,&elem);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
            printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
            printf("\t\t\t\t\t\t删除成功!\n");
        }
    }
    printf("\t\t\t\t\t\t\t");
    system("pause");

}

void q7(void)
{
    system("cls");
    if(is_empty_link(&Link_List) == TRUE)
    {
        printf("\t\t\t\t\t\t链式顺序表为空,无法输出!\n");

    }
    else
    {
        printf("\t\t\t\t\t\t\t顺序表中的元素输出如下: \n");
        Traverse_LkList(&Link_List);
    
    }
    printf("\t\t\t\t\t\t");
    system("pause");

}

void list_link_show(void)
{
    int c;

    while (1)
    {
        system("cls");
        printf("\t\t\t\t\t\t\t\t\t1: 创建链式线性表\n");
        printf("\t\t\t\t\t\t\t\t\t2: 求链式线性表的长度\n");
        printf("\t\t\t\t\t\t\t\t\t3: 按序号取链表元素\n");
        printf("\t\t\t\t\t\t\t\t\t4: 按值查找链表元素\n");
        printf("\t\t\t\t\t\t\t\t\t5: 插入元素\n");
        printf("\t\t\t\t\t\t\t\t\t6: 删除元素\n");
        printf("\t\t\t\t\t\t\t\t\t7: 输出链式线性表\n");
        printf("\t\t\t\t\t\t\t\t\t8: 返回\n");

        printf("\t\t\t\t\t\t\t请输入你的选择: ");
        scanf("%d",&c);
        if(c == 8)
            break;
        else
        {
            switch(c)
            {
                case 1:q1(); break;
                case 2:q2(); break;
                case 3:q3(); break;
                case 4:q4(); break;
                case 5:q5(); break;
                case 6:q6(); break;
                case 7:q7(); break;
                defalut: printf("\t\t\t\t输入错误\n");
                         printf("\t\t\t\t");
                         system("pause");
                         break;

            }
        }

    }
    

}

void main_show(void)
{
    int a;
    while(1)
    {
        system("cls");
        printf("\n\n\n\n\n\n\n");
        printf("\t\t\t\t\t\t\t1: 顺序表\n");
        printf("\t\t\t\t\t\t\t2: 链表\n");
        printf("\t\t\t\t\t\t\t3: 退出\n");
        printf("\t\t\t\t\t\t\t请输入你的选择(1-3): ");
        scanf("%d",&a);

        if(a == 1)
            list_sq_show();
        else if(a == 2)
            list_link_show();
        else if(a==3)
            break;
        else
        {
            system("cls");
            printf("\t\t\t\t\t\t输入错误, 程序即将退出!\n");
            break;
        }
    }
    printf("\t\t\t\t\t\t");
}



int main(void)
{
    main_show();

    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值