简单有序表【C语言程序设计】

来源:互联网 发布:java课程表管理系统 编辑:程序博客网 时间:2024/06/06 17:52

一.实验目的:

1.掌握指针与内存地址的关系

2.掌握通过指针动态申请和释放内存的编程方法

3.学习和掌握单向链表的基本操作

 

二、实验内容和步骤

1.分析并修改下面程序错误,使之能够正常运行。

错误代码一:

输入若干学生的信息(学号、姓名、成绩),当输入学号为 0 时结束,用单向链表组织这些学生信息后,再按序输出。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

structstud_node

{

intnum;

char name[20];

int score;

structstud_node *next;

};

int main()

{

structstud_node *head,*tail,*p;

intnum,score;

char name[20];

int size = sizeof(structstud_node);

head=tail=NULL;

printf(“input num,name and score:\n”);

scanf(“%d”,&num);

while(num != 0)

{

p=malloc(size);

scanf(“%s%d”,name,&score);

p->num=num;

strcpy(p->name,name);

p->score=score;

p->next=NULL;

tail->next=p;

tail=p;

scanf(“%d”,&num);

}

for(p=head;p->next != NULL;p=p->next)

printf(“%d  %s  %d\n”,p->num,p->name,p->score);

return  0;

}

 

正确代码:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct stud_node

{

 

    int number;

    char name[20];

    int score;

    struct stud_node *next;

};

 

int main()

{

    struct stud_node*head,*tail,*p;

    int num,scor,cnt=0;

    char name[20];

    int size = sizeof(structstud_node);

 

    head=(struct stud_node*)malloc(size);

 

    printf("input num:\n");

   scanf("%d",&num);

 

 

    while(num != 0)

    {

        cnt++;

        printf("inputname and score:\n");

       scanf("%s%d",name,&scor);

 

        p=(struct stud_node*)malloc(size);

 

        p->number=num;

       strcpy(p->name,name);

        p->score=scor;

 

        if(cnt==1)

        {

            head->next=p;

            tail=p;

        }

        else

        {

            tail->next=p;

            tail=p;

        }

 

        printf("\ninputnum:\n");

       scanf("%d",&num);

    }

    tail->next=NULL;

 

    p=head->next;

    printf("\nThestudents' massage:\n");

    while(p!=NULL)

    {

        printf("%d  %s %d\n",p->number,p->name,p->score);

        p=p->next;

    }

 

    return  0;

}

 

2. 编写程序实现以下功能

简单有序链表的创建和查询修改

(1)建立一个单链表 21  3  15  27  11  18,并输出该链表;

(2)输入序号n,查找序号为n的结点,并输出;

(3)输入值x,查找值为x的结点,并输出;

(4)插入结点: 输入序号 n和值x。在序号为n的结点后插入x,并输出该链表;

(5)删除结点: 输入序号 n,册除序号为 n 的结点,并输出该链表。

代码:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define lis struct list*

#define setup malloc(sizeof(lis))

 

struct list

{

    int n,x;

    lis next;

};

 

int i,len=6;

lis p;

lis t;

 

lis generate()

{

    lis head;

    lis tail;

 

   for(i=1;i<=len;i++)

    {

        p=setup;

       p->n=i;

       printf("Input %d number's price:\n",i);

       scanf("%d",&p->x);

        if(i==1)

        {

           head=tail=p;

        }

        else

        {

           tail->next=p;

           tail=p;

        }

    }

   tail->next=NULL;

 

    return(head);

}

 

void search_n(lis head)

{

    intnn,flag=0;

   printf("Please input n:\n");

   scanf("%d",&nn);

 

    p=head;

   while(p!=NULL)

    {

       if(p->n==nn)

        {

           printf("%d %d\n",p->n,p->x);

           flag=1;

        }

       p=p->next;

    }

    if(!flag)

       printf("Not find %d number's node.\n",nn);

}

 

void search_x(lis head0)

{

    intxx,flag=0;

   printf("Please input x:\n");

   scanf("%d",&xx);

 

    p=head0;

   while(p!=NULL)

    {

       if(p->x==xx)

        {

           printf("%d %d\n",p->n,p->x);

           flag=1;

        }

       p=p->next;

    }

    if(!flag)

       printf("Not find %d price of node.\n",xx);

}

 

lis insert(lis head1)

{

    int n,x;

   printf("Please input n and x:\n");

   scanf("%d%d",&n,&x);

 

    lis k=setup;

 

    k->n=n;

    k->x=x;

 

    p=head1;

 

   while(p->n!=n)

    {

       p=p->next;

    }

   if(p->next!=NULL)

    {

       t=p->next;

       p->next=k;

       k->next=t;

    }

    else

    {

       p->next=k;

       k->next=NULL;

    }

    return(head1);

}

 

lis delet(lis head2)

{

    int n;

   printf("Please input n to delete the node:\n");

   scanf("%d",&n);

 

    p=head2;

 

   while(p!=NULL)

    {

       if(p->n==n)

        {

           p=p->next;

           t->next=p;

        }

        t=p;

       p=p->next;

    }

    return(head2);

}

 

void output(lis head)

{

   printf("The current list:\n");

    p=head;

   while(p!=NULL)

    {

       printf("%d %d\n",p->n,p->x);

       p=p->next;

    }

}

 

int main()

{

    lisa=generate();

    output(a);

    search_n(a);

    search_x(a);

   output(insert(a));

   output(delet(a));

    return 0;

}