zoukankan      html  css  js  c++  java
  • 有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第二篇

    早先年考研的主考科目正是【算法与数据结构】,复习得还算可以。也在当时[百度知道]上回答了许多相关问题,现把他们一起汇总整理一下,供读者参考。


    【1】

    原题目地址:https://zhidao.baidu.com/question/1495131980697139059.html?entry=qb_uhome_tag

    题目:
    建立一个有5个结点的单向链表,每个结点包含姓名,年龄和工资.编写下列函数,然后在main函数中测试.
    2、建立一个有5个结点的单向链表,每个结点包含姓名、年龄和工资。编写下列函数,然后在main函数中测试。
    (1)用于建立链表的函数;
    (2)用来输出链表的函数;
    (3)编写插入结点的函数,在指定位置插入一个新结点;
    (4)编写删除结点的函数,在指定位置删除一个结点。
    要用C语言TT

    答:

    #include<stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <windows.h>
     
    typedef struct Node
    {
        char name[6];
        int age;
        int wage;
        struct Node *next;
    }NODE,*PNODE;
     
    PNODE Init();
    void Show(PNODE);
    PNODE Insert(PNODE,int);
    PNODE Delete(PNODE,int);
     
    PNODE Init()
    {
        PNODE head = NULL;
        PNODE pTail = NULL;
        int t=0;
        for(int i=0; i<5; i++)
        {
            PNODE pNew = (PNODE)malloc(sizeof(NODE));
            if(!pNew)
                exit(-1);
            printf("---%d---
    ",i+1);
            printf("输入姓名:");
            scanf("%s",&pNew->name);
            printf("输入年龄:");
            scanf("%d",&pNew->age);
            printf("输入工资:");
            scanf("%d",&pNew->wage);
            if(0==t)
            {
                head = (PNODE)malloc(sizeof(NODE));
                if(!head)
                    exit(-1);
                head = pNew;
                pNew->next = NULL;
                pTail = head;
                t=1;
            }
            else
            {
                pTail->next = pNew;
                pNew->next= NULL;
                pTail = pNew;
            }
        }
        return head;
    }
     
    void Show(PNODE head)
    {
        int i=1;
        PNODE p =  head;
        while(NULL!= p)
        {
     
            printf("---%d---
    ",i);
            printf("NAME:%s
    ",p->name);
            printf("AGE:%d
    ",p->age);
            printf("WAGE:%d
    ",p->wage);
            p = p->next;
            i++;
        }
        return;
    }
     
    PNODE Insert(PNODE head,int pos)
    {
        PNODE p = head;
        PNODE p2 = head;
        PNODE p1 = p;
        int t = pos;
        pos-=1;
        while(pos!=0)
        {
            p1 = p;
            p = p->next;
            pos--;
        }
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if(!pNew)
            exit(-1);
        printf("---%d---
    ",t);
        printf("输入姓名:");
        scanf("%s",&pNew->name);
        printf("输入年龄:");
        scanf("%d",&pNew->age);
        printf("输入工资:");
        scanf("%d",&pNew->wage);
        p1->next = pNew;
        pNew->next = p;
     
        return p2;
    }
     
    PNODE Delete(PNODE head,int pos)
    {
        PNODE p = head;
        PNODE p2 = head;
        PNODE p1 = p;
        pos-=1;
        while(pos!=0)
        {
            p1 = p;
            p = p->next;
            pos--;
        }
        p1->next = p->next;
        free(p);
        p = NULL;
     
        return p2;
    }
     
    int main()
    {
        PNODE head = NULL;
        head = Init();
        Show(head);
        head = Insert(head,2);
        Show(head);
        head = Delete(head,4);
        Show(head);
        system("pause");
        return 0;
    }
    

    【PS】我用的是无头指针的单链表。有些地方还可以改进,健壮程序。

    【2】

    原题目地址:https://zhidao.baidu.com/question/2074848498587475988.html?entry=qb_uhome_tag

    题目:
    编写程序,创建成一个正序排列的单链线性表,可实现删除一个元素,保持链表的正序。
    在执行完每个操作后将其输出。输入的无序序列为:(60,55,40,70,10,80)

    答:

    #include<stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <windows.h>
     
    typedef struct Node
    {
        int data;
        struct Node *next;
    }NODE,*PNODE;
     
    PNODE Init();
    void Show(PNODE);
    PNODE Delete(PNODE);
    PNODE Sort(PNODE);
     
    PNODE Init()
    {
        PNODE head = NULL;
        PNODE pTail = NULL;
        int t=0;
        for(int i=0; i<6; i++)
        {
            PNODE pNew = (PNODE)malloc(sizeof(NODE));
            if(!pNew)
                exit(-1);
            printf("[%d]",i+1);
            scanf("%d",&pNew->data);
            if(0==t)
            {
                head = (PNODE)malloc(sizeof(NODE));
                if(!head)
                    exit(-1);
                head = pNew;
                pNew->next = NULL;
                pTail = head;
                t=1;
            }
            else
            {
                pTail->next = pNew;
                pNew->next= NULL;
                pTail = pNew;
            }
        }
        return head;
    }
     
    void Show(PNODE head)
    {
        int i=1;
        PNODE p =  head;
        while(NULL!= p)
        {
     
            printf("[%d]:%d
    ",i,p->data);
            p = p->next;
            i++;
        }
        putchar(10);
        return;
    }
     
    PNODE Delete(PNODE head)
    {
        int pos;
        PNODE p = head;
        PNODE p2 = head;
        PNODE p1 = p;
         
        printf("想删除的节点:");
        scanf("%d",&pos);
        pos-=1;
        while(pos!=0)
        {
            p1 = p;
            p = p->next;
            pos--;
        }
        p1->next = p->next;
        free(p);
        p = NULL;
     
        return p2;
    }
     
    PNODE Sort(PNODE head)
    {
        PNODE p1 = head;
        PNODE p2 = NULL;
        PNODE p3 = head;
        int i,j,t;
        int len = 0;
        while(p1 != NULL)
        {
            p1 = p1->next;
            len++;
        }
        p1 = p3;
        p2 = p1->next;
        for(i = 0; i < len-1; i++,p1 = p1->next)
        {
            for(j = i+1,p2 = p1->next; j < len; j++,p2 = p2->next)
            {
                if(p1->data > p2->data)
                {
                    t = p1->data;
                    p1->data = p2->data;
                    p2->data = t;
                }
            }
        }
        return p3;
    }
     
    int main()
    {
        PNODE head = NULL;
        head = Init();
        printf("输入的数为:
    ");
        Show(head);
        printf("-------------------
    ");
        printf("排序之后的数为:
    ");
        head = Sort(head);
        Show(head);
        printf("删除之后的数为:
    ");
        head = Delete(head);
        Show(head);
        printf("-------------------
    ");
        system("pause");
        return 0;
    }
    

    上机测试:
    image
    【PS】这个是无头指针的做法!有些地方还能改进。

    【3】

    原题目地址:https://zhidao.baidu.com/question/919580753653115019.html?entry=qb_uhome_tag

    题目:
    关于链表的,对于我的代码,1,如果我原来只有一个结点,我删除这唯一的一个,2我原本就没有输入结点,或者输入了几个结点,要删除的确是一个不存在的结点,就会出现如图的情况,下面有我的代码

    #include<stdio.h>
    #include<stdlib.h>
    #define S sizeof(struct Student)
    
    struct Student {
      int num;
      char name[20];
      double math;
      struct Student *next;
    };
    
    void main()
    {
      struct Student *head, *p1, *p2, *p;
      int n=0, k;
      p1=(struct Student *)malloc(S); 
      scanf("%d%s%lf", &p1->num, p1->name, &p1->math);
      head=NULL;
      while (p1->num!=0) {
        n++;
        if (n==1) head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct Student *)malloc(S); 
        scanf("%d%s%lf", &p1->num, p1->name, &p1->math);
      }
      p2->next=NULL;
      printf("删除前:
    学号	名字	数学成绩
    "); 
      p=head;
      if (head!=NULL)
      do {
        printf("%d	%s	%.2f
    ", p->num, p->name, p->math);
        p=p->next;
      } while (p!=NULL);
      printf("请输入要删除的学号:");
      scanf("%d", &k);
      while (head!=NULL&&head->num==k) { 
        p2=head;
        head=head->next;
        free(p2);
      }
      p1=head;
      p2=head->next;
      while (p2!=NULL) {
        if (p2->num==k) {
          p1->next=p2->next;
          free(p2);
        } else p1=p2;
        p2=p1->next;
      }
      printf("删除后:
    学号	名字	数学成绩
    "); 
      p=head; 
      if (head!=NULL)
      do {
        printf("%d	%s	%.2f
    ", p->num, p->name, p->math);
        p=p->next;
      } while (p!=NULL);
    }
    
    

    image

    答:

    #include<stdio.h>
    #include<stdlib.h>
    #include <windows.h>
     
    #define S sizeof(struct Student)
    struct Student
    {
        int num;
        char name[20];
        double math;
        struct Student *next;
    };
     
    struct Student * Init(void);
    void Show(struct Student *);
    struct Student * Delete(struct Student *);
     
    struct Student * Init(void)
    {
        struct Student *head = NULL,*p1 = NULL,*p2 = NULL,*p = NULL;
        int n = 0;
        p1 = (struct Student *)malloc(S); 
        if(!p1)
            exit(-1);
        scanf("%d%s%lf",&p1->num,p1->name,&p1->math);
        head = NULL;
        while(p1->num != 0)
        {
            n++;
            if(1 == n) head = p1;
            else p2->next = p1; 
            p2 = p1; 
            p1 =(struct Student *)malloc(S);
            if(!p1)
                exit(-1);
            scanf("%d%s%lf",&p1->num,p1->name,&p1->math);
        }
        p2->next = NULL;
        return head;
    }
     
    void Show(struct Student * head)
    {
        struct Student * p = head;
        printf("
    学号	名字	数学成绩
    ");
        if(head != NULL)    
        do{     
            printf("%d	%s	%.2f
    ",p->num,p->name,p->math);       
            p = p->next;
          }while(p != NULL);   
        return;
    }
     
    struct Student * Delete(struct Student *head)
    {
        int k,t = 0;
        struct Student *p2,*p1,*p;
        p = head;
        p1 = head;
        p2 = p1;
        printf("请输入要删除的学号:");    
        scanf("%d",&k);
         
        if(k == head->num)
        {
            p2 = p1 = p = head->next;
            free(head);
            head = NULL;
            t = 1;
        }
        while(p1 != NULL)
        {
            if(p1->num == k)
            {
                p2->next = p1->next;
                free(p1);
                p1 = p2->next;
                t = 1;
            }
            else
            {
                p2 = p1;
                p1 = p1->next;
            }
        } 
        if(0 == t)
            printf("
    根据您输入的没找到相应节点!
    ");
        return p;
    }
     
    int main()
    {
        struct Student * head = NULL;
        head = Init();
        printf("删除前:");
        Show(head);
        head = Delete(head);
        printf("删除后:");
        Show(head);
     
        system("pause");
        return 0;
    }
    

    【PS】我不太明白您的意思。上面是我根据您给的程序修改过的。您先试试。有问题提出。另有一些值得提出的:

            1.建议您学习规范的编程书写。每个功能写相应的函数,不要都写在main函数里面,C语言是面向过程语言,这样写,思路清晰,维护也方便!
    
            2.每次动态分配内存之后要添加一句 if 语句,提高程序健壮性。
    
            3.每次建立了指向结构体的指针,要初始化一个值(一个地址,没有指定就NULL),避免野指针!也包括删掉了一个指向节点的指针后,这个指针也要清零!
    
            4.特别是Delete函数里面,我感觉您的程序里漏了几句重要语句!
    
  • 相关阅读:
    实验3-4 统计字符 (15分)
    实验3-5 查询水果价格 (15分)
    实验3-6 计算个人所得税 (10分)
    实验3-7 统计学生成绩 (15分)
    实验3-8 输出三角形面积和周长 (15分)
    实验3-9 三天打鱼两天晒网 (15分)
    实验3-11 计算油费 (15分)
    由一个商城项目得到的感悟
    ActiveMQ(三)——理解和掌握JMS(1)
    ActiveMQ(二)——ActiveMQ的安装和基本使用
  • 原文地址:https://www.cnblogs.com/sharpeye/p/15353852.html
Copyright © 2011-2022 走看看