1. 程式人生 > >實驗一 線性表的應用(2學時)

實驗一 線性表的應用(2學時)


1、實驗目的
通過本實驗,掌握線性錶鏈式儲存結構的基本原理和基本運算以及在實際問題中的應用。
2、實驗內容                                                      
  建立某班學生的通訊錄,要求用連結串列儲存。
  具體功能包括:
(1)可以實現插入一個同學的通訊錄記錄;
     (2)能夠刪除某位同學的通訊錄;
      (3)對通訊錄列印輸出。
3、實驗要求
(1)定義通訊錄內容的結構體;
(2)建立儲存通訊錄的連結串列結構並初始化;                                                 
(3)建立主函式:
       1)建立錄入函式(返回主介面)
       2)建立插入函式(返回主介面)
       3)建立刪除函式(返回主介面)
       4)建立輸出和列印函式(返回主介面)
            I)通過迴圈對所有成員記錄輸出
           II)輸出指定姓名的某個同學的通訊錄記錄
       5)退出


#include<stdio.h>

#include<string.h>
#include<stdlib.h>
#define MAXSIZE 12
typedef int datatype;
typedef struct link_node{
    char name[10];
    char tell[MAXSIZE];
    struct link_node *next;
}node;

node *init()
{
    node *head;
    head=(node *)malloc(sizeof(node));
    head->next=NULL;
}
void Insert(node *head)            //尾插法實現插入多個同學的通訊錄記錄;
{
    node *p,*q=head;
    int n;
    while(q->next) q=q->next;
    scanf("%d",&n);
    while(n)
    {
        p=(node*)malloc(sizeof(node));
        printf("輸入姓名:");
        scanf("%s",p->name);
        printf("輸入電話:");
        scanf("%s",p->tell);
        p->next=NULL;
        q->next=p;
        q=q->next;
        n--;
    }
}

void display(node *head)            //通訊錄列印輸出
{
    node *p;
    p=head->next;
    if(!p)
    {
    printf("\n暫無通訊錄資訊!");
    }
    else
    {
        while(p)
        {
        printf("姓名: %s\n",p->name);
        printf("電話: %s\n",p->tell);
        p=p->next;
        }
    }
}

node *Find(node *head)                    //查詢通訊錄是否存在要刪除的資訊
{
    node *p;
    p=head->next;
    char name[10];
    char tell[MAXSIZE];
    int t;
    printf("****************\n");
    printf("1.按姓名查詢 \n");
    printf("2.按電話查詢 \n");
    printf("****************\n");
    printf("請選擇1/2:");
    scanf("%d",&t);
    if(t==1)
    {
        printf("輸入所查詢的姓名:");
        scanf("%s",name);
        while(p&&strcmp(p->name,name)!=0)
        p=p->next;

    }
    else if(t==2)
    {
        printf("輸入所查詢的電話:");
        scanf("%s",tell);
        while(p&&strcmp(p->tell,tell)!=0)
        p=p->next;

    }
    else
    {
        printf("輸入有誤,請重新輸入\n");
        Find(head);
    }
    return p;
}

node *dele(node *head)                       //通訊錄上資訊的刪除
{
    node *p,*q;
    p=Find(head);
    q=head;
    if(p!=NULL)
    {
        while(q->next!=p)
            q=q->next;
        q->next=p->next;
        free(p);
        printf("通訊者已被刪除!\n");
    }
    else
    {
            printf("沒有查到要查詢的電話資訊!\n");
            p=NULL;
    }
    return head;
}

int main()
{
    int k,j=1;
    node *head;
    printf("****************\n");
    printf(" 1.初始化\n");
    printf(" 2.通訊錄的刪除\n");
    printf(" 3.通訊錄的列印\n");
    printf(" 4.通訊錄的插入\n");
    printf(" 0.退出查詢系統\n");
    printf("****************\n");
    printf("\n請選擇選單(0-4):");
    while(j)
    {
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            {
                printf("初始化完成     \n");
                head=init();

            }break;
        case 4:
            {
                printf("通訊錄的插入     \n");
                Insert(head);
            }break;
        case 2:
            {
                printf("通訊錄的刪除     \n");
                dele(head);
            }break;
        case 3:
            {
                printf("通訊錄的列印     \n");
                display(head);
            }break;
        case 0:
            {
                j=0;
            }break;
        default:
            {
                printf("輸入有誤,請重新輸入!\n");
                getchar();
                break;
            }
        }
    }
    return 0;
}