程序设计考题汇总(二)

13、结构体实现

在这里插入图片描述

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


struct Person
{
	char name[20];
	int count;
}leader[3]={"Li",0,"Wang",0,"Zhang",0};

int main(){

	int i,j;
	char leader_name[20];
	for(i=0;i<=10;i++){
		scanf("%s",leader_name);
		for(j=0;j<3;j++){
			if(strcmp(leader_name,leader[j].name)==0)
				leader[j].count++;
		}
		
	}
	printf("\nResult:\n");
	for(i=0;i<3;i++)
		printf("%5s:%d\n",leader[i].name,leader[i].count );

	return 0;
}

在这里插入图片描述

14.单链表实现

// 链表
#include <stdio.h>
#include <stdlib.h>

typedef enum{false,true} bool;

typedef struct node{
    int data;
    struct node *next;
} LinkNode;


//(1)创建链表,建立头结点
LinkNode *InitList(){
    LinkNode *L;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    L->data=0;
    return L;
}
//创建链表,无头结点
//     LinkNode *L=NULL;


//(2)销毁链表(带头结点)
void DestroyList(LinkNode *L){
    LinkNode *p,*t;
    p=L;
    do{
        t=p;
        p=p->next;
        free(t);
    } while(p!=NULL);
}
//销毁链表(不带头结点)
// void DestroyList(LinkNode *L){
//     LinkNode *p,*t;
//     p=L;
//     while(p!=NULL){
//         t=p;
//         p=p->next;
//         free(t);
//     } 
// }


//(3)判断链表是否为空表(带头结点)
bool IsEmpty(LinkNode *L){
    if(L->next==NULL)
        return true;
    else return false;
}
//判断链表是否为空表(不带头结点)
// bool IsEmpty(LinkNode *L){
//     return (L==NULL);
// }


//(4)求链表长度(带头结点)
int ListLength(LinkNode *L){
    int n=0;
    LinkNode *p=L;
    while(p->next!=NULL){
        n++;
        p=p->next;
    }
    return n;
}
//求链表长度(不带头结点)
// int ListLength(LinkNode *L){
//     int n=0;
//     LinkNode *p=L;
//     while(p!=NULL){
//         n++;
//         p=p->next;
//     }
//     return n;
// }


//(5)输出链表(带头结点)
void DispList(LinkNode *L){
    LinkNode *p=L;
    while(p->next!=NULL){
        printf("%d ,",p->next->data);
        p=p->next;
    }
    printf("\n");
}
//输出链表(不带头结点)
// void DispList(LinkNode *L){
//     LinkNode *p=L;
//     while(p!=NUll){
//         printf("%d,",p->data);
//         p=p->next;
//     }
// }


//(6)按位置查找元素(带头节点)
int GetElem(LinkNode *L,int i){
    int j=0,t=-1;
    LinkNode *p=L;
    if(i<=0)
        printf("链表不存在该位置\n");
    else{
        while(j<i && p->next!=NULL){
            j++;
            p=p->next;
        }
        if(j==i)
            t=p->data;
        else
            printf("链表不存在该位置\n");
    }
    return t;
}
//按位置查找元素(不带头节点)
// bool GetElem(LinkNode *L,int i,int *e){
//     int j=0;
//     LinkNode *p=L;
//     while(p!=NULL){
//         j++;
//         if(j==i){
//           *e=p->data;
//           break;
//         }
//         p=p->next;
//     }

//     if(j==i)
//         return true;
//     else
//         return false;
// }


//(7)按元素查找位置(带头结点)
int LocatElem(LinkNode *L,int e){
    int i=0,flag=0;
    LinkNode *p=L;
    while(p->next!=NULL){
        i++;
        if(p->next->data==e){
          flag=1;
          break;
        }
        p=p->next;
    }
 	if(flag==1) return i;
    else return 0;
}
//按元素查找位置(不带头结点)
// int LocatElem(LinkNode *L,int e){
//     int i=0;
//     LinkNode *p=L;
//     while(p!=NULL){
//         i++;
//         if(p->data==e)
//             break;
//         p=p->next;
//     }
//     return i;
// }


//(8)插入数据元素(带头结点)
//头插法
void ListInsertF(LinkNode *L,int e){
    LinkNode *p;
    p=(LinkNode *)malloc(sizeof(LinkNode));
    p->data=e;
    p->next=L->next;
    L->next=p;
    L->data++;
}
//尾插法
void ListInsertR(LinkNode *L,int e){
    LinkNode *p,*q=L;
    p=(LinkNode *)malloc(sizeof(LinkNode));
    p->data=e;
    p->next=NULL;
    while(q->next!=NULL)
        q=q->next;
    q->next=p;
    L->data++;
}
//按位置插入(插在第i位前边)
void ListInsert1(LinkNode *L,int e,int i){
    int j=1;
    LinkNode *p,*q=L;
    p=(LinkNode *)malloc(sizeof(LinkNode));
    p->data=e;
    p->next=NULL;
    if(i<=0)
        printf("链表不存在该位置\n");
    else{
        while(j<i && q->next!=NULL){
            j++;
            q=q->next;
        }
        if(j!=i)
            printf("链表不存在该位置\n");
        else{
            p->next=q->next;
            q->next=p;
            L->data++;    
        }  
    }
}
//按元素从小到大插入
void ListInsert2(LinkNode *L,int e){
    LinkNode *p,*q=L;
    p=(LinkNode *)malloc(sizeof(LinkNode));
    p->data=e;
    p->next=NULL;
    while(q->next!=NULL&&q->next->data<=e)
        q=q->next;
    p->next=q->next;
    q->next=p;
    L->data++;
}
//插入数据元素(不带头结点)
//头插法
// void ListInsertF(LinkNode *L,int e){
//     LinkNode *p;
//     p=(LinkNode *)malloc(sizeof(LinkNode));
//     p->data=e;
//     p->next=NULL;
//     if(L==NULL)
//         L=p;
//     else{
//         p->next=L->next;
//         L=p;
//     }
// }
//尾插法
// void ListInsertR(LinkNode *L,int e){
//     LinkNode *p,*q=L;
//     p=(LinkNode *)malloc(sizeof(LinkNode));
//     p->data=e;
//     p->next=NULL;
//     if(L==NULL)
//         L=p;
//     else{
//         while(q->next!=NULL)
//             q=q->next;
//         q->next=p;
//     }
// }
//按位置插入(插在第i位后边)
// void ListInsert1(LinkNode *L,int e,int i){
//     int j=1;
//     LinkNode *p,*q=L;
//     p=(LinkNode *)malloc(sizeof(LinkNode));
//     p->data=e;
//     p->next=NULL;
//     if(i==0&&L==NULL)
//         L=p;
//     else if(i==0&&L!=NULL){
//         p->next=q;
//         L=p;
//     }else if(i==1&&L==NULL){
//         printf("链表不存在第%d位\n",i);
//     }else if(i==1&&L!=NULL){
//         p->next=q->next;
//         q->next=p;
//     }
//     while(j<i&&q!=NULL){
//         j++;
//         q=q->next;
//         if(j==i){
//             p->next=q->next;
//             q->next=p;
//             break; 
//         }
//     }
//     if(j!=i)
//         printf("链表不存在第%d位\n",i);
// }
//按元素从小到大插入
// void ListInsert2(LinkNode *L,int e){
//     LinkNode *p,*q=L;
//     p=(LinkNode *)malloc(sizeof(LinkNode));
//     p->data=e;
//     p->next=NULL;
//     if(L==NULL)
//         L=p;
//     else if(L!=NULL&&q->data>e){
//         p->next=q;
//         L=p;
//     }
//     while(q->next!=NULL&&q->next->data<=e)
//         q=q->next;
//     p->next=q->next;
//     q->next=p;
// }


//(9)删除链表元素(带头结点)
//按位置删除
void ListDelete1(LinkNode *L,int i){
    int j=0;
    LinkNode *p,*q=L;
    if(i<=0)
        printf("不存在要删除的数据!");
    else{
        while(j<i-1 && q->next!=NULL){
            j++;
            q=q->next;
        }
        if(q->next==NULL)
            printf("不存在要删除的数据!");  
        else{
            p=q->next;
            q->next=p->next;
            free(p);
        }
    }
}
//按元素删除
void ListDelete2(LinkNode *L,int e){
    LinkNode *p,*q=L;
    while(q->next!=NULL){
        p=q->next;
        if(p->data==e){
            q->next=p->next;
            free(p);
            continue;
        }
        q=q->next;
    }  
}




int main(){
    LinkNode *L=InitList();
    int n,e,i;
    int *t;
    printf("请输入链表初始化元素个数:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("请输入插入数据:\n");
        scanf("%d",&e);
        // ListInsertR(L,e);
        ListInsertF(L,e);
    }
    DispList(L);
    printf("\n链表长度为:%d\n",ListLength(L));
  
    printf("链表第2位数字是:%d\n",GetElem(L,2));
    printf("3所在的位置是:%d\n",LocatElem(L,3));

    ListInsert1(L,200,2);
    DispList(L);
    ListInsert2(L,300);
    DispList(L);

    ListDelete1(L,3);
    DispList(L);
    ListDelete2(L,300);
    DispList(L);


    return 0;
}



15、双链表

//双链表
#include <stdio.h>
#include <stdlib.h>

typedef enum {false,true} bool;

typedef struct node{
   int data;
   struct node *prior;
   struct node *next;
}LinkNode;

//创建
LinkNode *InitList(){
   LinkNode *L;
   L=(LinkNode *)malloc(sizeof(LinkNode));
   L->next=NULL;
   L->prior=NULL;
   L->data=0;
   return L;
}


//销毁
void DestroyList(LinkNode *L){
   LinkNode *p,*t;
   p=L;
   do{
      t=p;
      p=p->next;
      free(t);
   }while(p!=NULL);
}


//判空
bool IsEmpty(LinkNode *L){
   if(L->next==NULL)
      return true;
   else return false;
}


//求长度
int ListLength(LinkNode *L){
   int n=0;
   LinkNode *p=L;
   while(p->next!=NULL){
      n++;
      p=p->next;
   }

   return n;
}


//输出链表
void DispList(LinkNode *L){
   LinkNode *p=L;
   while(p->next!=NULL){
      printf("%d ,",p->next->data);
      p=p->next;
   }
   printf("\n");
}


//查找
//按位置找元素
int GetElem(LinkNode *L,int i){
   int j=0,t=-1;
   LinkNode *p=L;
   if(i<=0)
      printf("链表不存在该位置\n");
   else{
      while(j<i&&p->next!=NULL){
         j++;
         p=p->next;
      }
      if(j==i)
         t=p->data;
      else
         printf("链表不存在该位置\n");
   }

   return t;
}
//按元素找位置
int LocatElem(LinkNode *L,int e){
	int i=0,flag=0;
    LinkNode *p=L;
    while(p->next!=NULL){
        i++;
        if(p->next->data==e){
          flag=1;
          break;
        }
        p=p->next;
    }
 	if(flag==1) return i;
    else return 0;
}


//插入数据元素
//头插法
void ListInsertF(LinkNode *L,int e){
   LinkNode *p;
   p=(LinkNode *)malloc(sizeof(LinkNode));
   p->data=e;
   p->next=L->next;
   if(L->next!=NULL)
      L->next->prior=p;
   L->next=p;
   p->prior=L;
   L->data++;
}
//尾插法
void ListInsertR(LinkNode *L,int e){
   LinkNode *p,*q=L;
   p=(LinkNode *)malloc(sizeof(LinkNode));
   p->data=e;
   p->next=NULL;
   while(q->next!=NULL)
      q=q->next;
   q->next=p;
   p->prior=q;
   L->data++;
}
//按位置插入
void ListInsert1(LinkNode *L,int e,int i){
   int j=1;
   LinkNode *p,*q=L;
   p=(LinkNode *)malloc(sizeof(LinkNode));
   p->data=e;
   p->next=NULL;
   if(i<=0)
      printf("链表不存在该位置\n");
   else{
      while(j<i&&q->next!=NULL){
         j++;
         q=q->next;
      }
      if(j!=i)
         printf("链表不存在该位置\n");
      else{
         p->next=q->next;
         if(q->next!=NULL)
            q->next->prior=p;
         q->next=p;
         p->prior=q;
      }
   }
}
//按元素从小到大插入
void ListInsert2(LinkNode *L,int e){
   LinkNode *p,*q=L;
   p=(LinkNode *)malloc(sizeof(LinkNode));
   p->data=e;
   p->next=NULL;
   while(q->next!=NULL&&q->next->data<=e)
      q=q->next;
   p->next=q->next;
   if(q->next!=NULL)
      p->next->prior=p;
   q->next=p;
   p->prior=q;
   L->data++;
}



//删除元素
//按位置删除
void ListDelete1(LinkNode *L,int i){
   int j=0;
   LinkNode *p,*q=L;
   if(i<=0)
      printf("不存在要删除的数据!");
   else{
      while(j<i-1 && q->next!=NULL){
         j++;
         q=q->next;
      }
      if(q->next==NULL)
         printf("不存在要删除的数据!");
      else{
         p=q->next;
         if(p->next!=NULL)
            p->next->prior=q;
         q->next=p->next;
         free(p);
         L->data--;
      }
   }
}
//按元素删除
void ListDelete2(LinkNode *L,int e){
   LinkNode *p,*q=L;
   while(q->next!=NULL){
      p=q->next;
      if(p->data=e){
         if(p->next!=NULL)
            p->next->prior=q;
         q->next=p->next;
         free(p);
         L->data--;
         continue;
      }
      q=q->next;
   }
}



int main(){
    LinkNode *L=InitList();
    int n,e,i;
    int *t;
    printf("请输入链表初始化元素个数:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("请输入插入数据:\n");
        scanf("%d",&e);
        // ListInsertR(L,e);
        ListInsertF(L,e);
    }
    DispList(L);
    printf("\n链表长度为:%d\n",ListLength(L));
  
    printf("链表第2位数字是:%d\n",GetElem(L,2));
    printf("3所在的位置是:%d\n",LocatElem(L,3));

    ListInsert1(L,200,2);
    DispList(L);
    ListInsert2(L,300);
    DispList(L);

    ListDelete1(L,3);
    DispList(L);
    ListDelete2(L,300);
    DispList(L);

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值