期末复习-链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 80
struct VIP_record{
    char VIP_Name[20];
    int VIP_Years;
}; 
struct VIP_List{
    struct VIP_record vip[MAXSIZE];
    int length;
};

VIP_List vip_list;

void menu();
void Create_VIP();
void Print_VIP();
void Print_Elem();
void Insert_VIP();
void Delete_VIP();
void Bubble_Sort_Name();
void Bubble_Sort_Years();
int Find_VIP(char *delname);

int main(){
    vip_list.length=0;
    menu();
    return 0;
}
void menu(){
    system("cls");
    int choice;
    printf("\t\t\t*******************************************\n"); 
    printf("\t\t\t*************  客户信息管理  **************\n"); 
    printf("\t\t\t*******************************************\n"); 
    printf("\t\t\t*******      1----输入客户信息     ********\n");
    printf("\t\t\t*******      2----显示客户信息     ********\n");
    printf("\t\t\t*******      3----插入客户信息     ********\n");
    printf("\t\t\t*******      4----删除客户信息     ********\n");
    printf("\t\t\t*******      0----退出             ********\n");
    printf("\t\t\t*******************************************\n"); 
    printf("请选择:\n");
    scanf("%d",&choice);
    switch(choice){
        case 1:Create_VIP();break;
        case 2:Print_VIP();break;
        case 3:Insert_VIP();break;
        case 4:Delete_VIP();break;
        case 0:exit(0);
        default:printf("输入错误\n");
    }
} 
void Create_VIP(){
    int c,i;
    printf("********创建客户表*********\n");
    printf("请输入人数(<=80):\n");
    scanf("%d", &vip_list.length);
    getchar(); //清除回车符
    for(i=0;i<vip_list.length;i++){
        printf("请输入第%d个客户的姓名:",i+1);
        gets(vip_list.vip[i].VIP_Name);
        printf("请输入第%d个客户的年限:",i+1);
        scanf("%d",&vip_list.vip[i].VIP_Years); 
        getchar();
        }
    Print_Elem();
    printf("返回主菜单?\n1----返回主菜单\n2-结束程序\n");
    printf("请选择:\n");
    scanf("%d",&c); 
    if(c==1) menu();
    else exit(0);
 } 
void Print_Elem(){
    system("cls"); 
    printf("********输出客户表*********\n");
    int i;
    printf("客户信息如下:\n");
    printf("序号\t姓名\t客户年限\n");
    for(i=0;i<vip_list.length;i++)
        printf("%d\t%s\t%d\n",i+1,vip_list.vip[i].VIP_Name,vip_list.vip[i].VIP_Years); 
    printf("\n");

}
void Print_VIP(){
    int choice;
    while(1){
        printf("请选择:\n1----按姓名排序\n2----按年限排序\n0----返回主菜单\n");
        scanf("%d",&choice); //请用户选择排序方式
        if(choice==0) {printf("再见!\n");menu();break;}
        if(choice==1){
            Bubble_Sort_Name();
            Print_Elem();
        } 
        else{
            Bubble_Sort_Years();
            Print_Elem();
        }
    }
}
void Bubble_Sort_Name(){
    int i,j;
    struct VIP_record t;
    for(i=1;i<=vip_list.length-1;i++){
        for(j=0;j<vip_list.length-i;j++){
            if(strcmp(vip_list.vip[j].VIP_Name,vip_list.vip[j+1].VIP_Name)>0){
                t=vip_list.vip[j];
                vip_list.vip[j]=vip_list.vip[j+1];
                vip_list.vip[j+1]=t;
            }
        }
    } 
}
void Bubble_Sort_Years(){
    int i,j;
    struct VIP_record t;
    for(i=1;i<=vip_list.length-1;i++){
        for(j=0;j<vip_list.length-i;j++){
            if(vip_list.vip[j].VIP_Years>vip_list.vip[j+1].VIP_Years){
                t=vip_list.vip[j];
                vip_list.vip[j]=vip_list.vip[j+1];
                vip_list.vip[j+1]=t;
            }
        }
    } 
}
void Insert_VIP(){//将新的客户插入在客户表的最后 
    int c=1;
    printf("********插入客户信息*********\n");
    while(c){
        getchar();
        printf("请输入客户姓名:\n");
        gets(vip_list.vip[vip_list.length].VIP_Name);
        printf("请输入客户年限:");
        scanf("%d",&vip_list.vip[vip_list.length].VIP_Years); 
        vip_list.length++;
        printf("是否继续输入?\n1----输入下一位客户\n2----结束输入\n");
        printf("请选择:\n");
        scanf("%d",&c);
        if(c!=1)break; 
    }
    printf("返回主菜单?\n1----返回主菜单\n2-结束程序\n");
    printf("请选择:\n");
    scanf("%d",&c); 
    if(c==1) menu();
    else exit(0);
 } 
void Delete_VIP(){
    int num,i,c=1;
    char delname[20];
    printf("********删除客户信息*********\n");
    while(c){
        printf("请输入要删除的客户姓名:\n");
        scanf("%s",delname); 
        num=Find_VIP(delname);
        if(num==-1){
            printf("未找到要删除的客户\n重新输入请按1,返回主菜单请按2");
            scanf("%d",&c);
            if(c==1)continue;
            else {
                menu();
            }
        }
        for(i=num;i<vip_list.length-1;i++){
            strcpy(vip_list.vip[i].VIP_Name,vip_list.vip[i+1].VIP_Name);
            vip_list.vip[i].VIP_Years=vip_list.vip[i+1].VIP_Years;
        }
        vip_list.length--;
        printf("是否继续删除?\n1----删除下一位客户\n2----结束删除\n");
        printf("请选择:\n");
        scanf("%d",&c);
        if(c!=1)break; 
    }
    printf("返回主菜单?\n1----返回主菜单\n2-结束程序\n");
    printf("请选择:\n");
    scanf("%d",&c); 
    if(c==1) menu();
    else exit(0);
 } 

 int Find_VIP(char *delname){
    int i;
    for(i=0;i<vip_list.length;i++){
        if (strcmp(vip_list.vip[i].VIP_Name,delname)==0){
            return i;
         }
     }
    return -1;
 }
# include <stdio.h>
# include <stdlib.h> 
# include <process.h> 


typedef struct LNode{//链表结构定义,假设数据域的值为一个整数 
   int data;
   struct LNode *next;
} LNode,*LinkList;
//链表的建立
/***************************/
//函数名:CreateList_L(LinkList &L, int n)
//参数:  L表示创建的单链表,n表示创建的单链表的长度
//功能:根据给定长度n,逆位序输入n个元素的值,建立带表头结点的单链表L。
/***************************/
void CreateList_L(LinkList &L, int n) { 
int i; 
LinkList p;
  L = (LinkList) malloc (sizeof (LNode));
  L->next = NULL; // 先建立一个带头结点的单链表
  for (i = n; i > 0; --i) {
     p = (LinkList) malloc (sizeof (LNode)); // 生成新结点
     printf("请输入第%d个元素:",i);
     scanf("%d",&p->data); // 逆位序输入元素值
    p->next = L->next;   L->next = p; // 插入到表头
  }
} // CreateList_L
//链表的打印
/***************************/
//函数名:PrintList(LinkList L)
//参数:  L表示单链表的头指针
//功能:逐个打印单链表L的各个数据元素的值
/***************************/
void PrintList(LinkList L){
    LinkList p;
    p=L;
    printf("Begin to print the LinkList...\n");
    while(p->next!=NULL){
      printf("%d->",p->next->data);
      p=p->next;
    }
    printf("----------The LinkList ended!\n");
}
//求链表的长度
/***************************/
//函数名:Listlength(LinkList L)
//参数:  L表示单链表的头指针
//返回:int型,返回整数值,表示单链表的长度
//功能:求单链表L的长度
/***************************/
int Listlength(LinkList L){
  int i=0;
  LNode *p=L;
  while(p->next!=NULL){
       i++;
       p=p->next;
    }
   return i;
}
//链表的插入操作
/***************************/
//函数名:InsertList(LinkList &L,int i,int e)
//参数:  L表示单链表的头指针,i表示插入位置,e表示插入的数据元素的值
//返回:int型,返回1,表示插入成功,0表示插入失败
//功能:将数据元素e插入到单链表L的第i个位置上
/***************************/
int InsertList(LinkList &L,int i,int e){
// 在带头结点的单链线性表L的第i个元素之前插入元素e
  LinkList p,s;
  p = L;   
  int j = 0;
  while (p && j < i-1) {  // 寻找第i-1个结点
    p = p->next;
    ++j;
  } 
  if (!p || j > i-1) return 0;      // i小于1或者大于表长
  s = (LinkList)malloc(sizeof(LNode));  // 生成新结点
  s->data = e;  s->next = p->next;      // 插入L中
  p->next = s;
  return 1;

}
//链表的删除操作
/***************************/
//函数名:DeleteList(LinkList &L,int i)
//参数:  L表示单链表的头指针,i表示删除元素的位置
//返回:int型,返回删除元素的值
//功能:将单链表L的第i个结点删除,并返回删除元素的值
/***************************/
int DeleteList(LinkList &L,int i){
    // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  LinkList p,q;
  int e;
  p = L;
  int j = 0;
  while (p->next && j < i-1) {  // 寻找第i个结点,并令p指向其前趋
    p = p->next;
    ++j;
  }
  if (!(p->next) || j > i-1) return 0;  // 删除位置不合理
  q = p->next;
  p->next = q->next;           // 删除并释放结点
  e = q->data;
  free(q);
  return 1;

}
void BubbleSort (LinkList &L){//单链表的冒泡排序 
    LNode *cur,*teil;
    cur = L->next ;
    teil=NULL;
    while(cur != teil)
    {
        while(cur->next != teil)
        {
            if(cur->data > cur->next ->data )
            {
                int tmp = cur->data ;
                cur->data = cur->next ->data ;
                cur->next ->data = tmp;
            }
            cur = cur->next ;
        }
        teil = cur;
        cur = L->next ;
    }
    return ;
}
//主程序
int main(){
   LinkList L;
   int length;
   int i,e;
   CreateList_L(L,10);
   PrintList(L);
   length=Listlength(L);
   printf("the length of the list is %d\n",length);
   printf("input the delete position \n");
   scanf("%d",&i);
   DeleteList(L,i);
   PrintList(L);
   printf("Input the insert position  and e:\n");
   scanf("%d%d",&i,&e);
   InsertList(L,i,e);
   PrintList(L);
   BubbleSort (L);
   printf("After sort:\n");
   PrintList(L);
   getchar();
   system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值