数据结构与算法 上机实验报告

一、实验一 顺序表

ex1_1——基本题:
1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于20),按输入顺序放入顺序表,输入以-1结束(注意-1不放到顺序表内);将创建好的顺序表元素依次输出到屏幕上。

2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作;然后将顺序表元素依次输出到屏幕上。

3)在已创建好的顺序表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作;然后将顺序表元素依次输出到屏幕上。

ex1_2——扩展题:
(1)教材第9题(用顺序表实现)
注意该题中没有提供插入元素的具体位置,要根据元素值大小寻找合适的位置。
(2)(输入一组数建立顺序表),顺序表中包括多个负数,编写算法删除其中所有的负数
本题的特点是优化:怎样在一轮循环中删除,而不是每删除一个,都把后续元素搬移一次。

ex1_3——扩展题:
输入一组数,建立顺序表,编写算法将整个表的元素全部反序存放——即第一个元素放到最后……。

本题的特点在优化,怎样在原表上,直接实现反序——即不额外使用一张新表。

二、程序代码

#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 20
#define true 1
#define false 0

typedef struct
{
     
      int data[MAXNUM];
      int length;
}list_type; 

//创建顺序表函数 
void createlist(list_type *lp)
{
   
  int i, elem;
  lp->length=0;
  printf("\nplease input datas of the list\n");
  for(i=0; i< MAXNUM; i++)
  {
   
        scanf(" %d", &elem);
        if(elem== -1) break;
        lp->data[i]=elem;
        lp->length++;
  }
}

//遍历元素并依次输出函数
void showlist(list_type *lp)
{
   
  int i;
  printf("\nThese %d records are:\n", lp->length);
  if(lp->length<=0)
  {
   
       printf("No data!\n");
       return;
  }
  for(i=0; i<lp->length; i++)
      printf(" %d ", lp->data[i]);
  printf("\nlength of the list is:%d", lp->length);
}

//插入函数,成功返回true,反之返回false。
int insertlist(list_type *lp, int new_elem, int i)
{
     int j;
    if(lp->length>=MAXNUM)
   {
   
        printf("the list is full,can not insert.");
        return(false);
   }
   if(i<1 || i>lp->length+1)
   {
   
        printf("\n%d is invalid value",i);
        return(false);
   }
   for(j=lp->length;j>=i-1;j--){
   
    lp->data[j]=lp->data[j-1];
   }
   lp->data[i-1]=new_elem;
   lp->length++;
   //放入新元素;
   //表长度增加;
   return(true);
}

//删除函数,成功返回true,反之返回false。
int deletelist(list_type *lp, int i)
{
   
   int j;
   if(i<1 || i>lp->length)
   {
   
        printf("elem not exist");
        return(false);
   }
   for(j=i-1;j<lp->length-1;j++){
   
    lp->data[j]=lp->data[j+1];
   }
   lp->length--;
   //表长度减少;
   return(true);
}

//找位置并插入数据
int insert_in_order(list_type *lp,int data)
{
   
	int i,j;
	if(lp->length>=MAXNUM)
	{
   
		printf("the list is full,can not insert.");
		return false;
	} 
	else
	{
   
		for(i=0;i<lp->length;i++)
		{
   
			if(lp->data[i]>=data)
			{
   
				j=i;
				lp->length++;
				break;
			}
		}
		for(i=lp->length-1;i>j;i--)
		{
   
			lp->data[i]=lp->data[i-1]; 
		}
		lp->data[j]=data;
	}
} 

//删除所有负数的函数
void delete_negative(list_type *lp)
{
   
	int i,j=0;
	for(i=0;i<lp->length;i++)
	{
   
		if(lp->data[i]>=0)
		{
   
			if(j<i) lp->data[j]=lp->data[i];
			j++;
		}
	}
	lp->length=j;
}

//反序
 void reverse_list(list_type *lp)
 {
   
 	int temp,i=0;
 	for(i=0;i<lp->length/2;i++)
 	{
   
 		temp=lp->data[i];
 		lp->data[i]=lp->data[lp->length-1-i];
 		lp->data[lp->length-i-1]=temp;
 	}
 }

//主函数,按要求调用已编写好的各函数
int main()
{
   
    list_type list;
    int i, data;
    createlist(&list);
    showlist(&list);
    delete_negative(&list);
    printf("\nlist after delet:\n");
    showlist(&list);
    printf("\ninsert:Enter i and data :\n");
    scanf("%d %d", &i, &data);
    insertlist(&list, data, i);
    printf("\nlist after insert:\n");
    showlist(&list);
    printf("\ndelete:Enter i:\n");
    scanf("%d", &i);
    deletelist(&list, i);
    printf("\nlist after delete:\n");
    showlist(&list);
    printf("\ninsert:Enter data :\n");
    scanf("%d", &data);
    insert_in_order(&list,data);
    printf("\nlist after insert:\n");
    showlist(&list);
    reverse_list(&list);
    printf("\nlist after reverse:\n");
    showlist(&list);
    return 0;
/*  delete_negative(&list);
     printf("\nlist after delete all negative:\n");
     showlist(&list);*/
}

一、实验二 链表

ex2_1——基本题
1)首先创建一个单链表:从键盘读入五个整数,按输入顺序形成单链表。将创建好的链表元素依次输出到屏幕上。
2)在已创建好的链表中插入一个元素:从键盘读入元素值和插入位置,调用插入函数完成插入操作。然后将链表元素依次输出到屏幕上。
3)在已创建好的链表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作。然后将链表元素依次输出到屏幕上。

ex2_2——扩展题
1)创建一个单链表,其数据元素为整数,从键盘输入,输入0结束(注意0不放到链表内);
2)从键盘任意输入一个整数,在单链表中查询该数,如果单链表中已经存在这个数,就调用删除函数,删除该元素所在结点,并将单链表在删除前后的数据元素依次输出到屏幕上;
如果单链表中不存在这个数,就调用插入函数,将这个数插入到单链表尾,并将单链表在插入前后的数据元素依次输出到屏幕上。
3)教材第一章习题第9题(用链表实现)

ex2_3——扩展题
1)删除单链表中全部的负数
2)创建一个双向链表,按照冒泡排序的思路对这个双向链表进行排序,打印排序结果。注意,本算法在交换元素时是将链点整个交换而不是将链点中的元素值交换。

二、程序代码

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//定义链式存储线性表的结构
typedef struct Node
{
   
    int data;
    struct Node * next; 
} Node,*LinkList;

//双向链表 
typedef struct DoubleNode
{
   
	struct DoubleNode *pre;
	int data;
	struct DoubleNode *next;
}*DoubleLinkList;

//初始化链表
void InitList(LinkList &head)
{
   
	head=(Node*)malloc(sizeof(Node));
	if(head==NULL)
	{
   
		printf("Init erroe!\n");
		exit(-1);
	} 
	head->next=NULL;
	printf("Init List success!\n");
}

//输出链表
void PrintList(LinkList &head)
{
   
	Node *p=head;
	Node *s=NULL;
	printf("The List is:\n");
	while(p->next!=NULL)
	{
   
		s=p->next;
		p=s;
		printf("%d\t",s->data);
	}
	printf("\n");
}

//初始化双向链表
void InitDoubleList(DoubleLinkList &dhead)
{
   
    dhead=(DoubleLinkList)malloc(sizeof(DoubleNode));
    if(dhead)
    {
   
    	dhead->pre=dhead->next=dhead;
    	printf("Init success!\n");
    }
    else printf("Init error!\n");
}

//输出双向链表
void PrintfDoubleList(DoubleLinkList &dhead)
{
   
	DoubleNode *p=dhead->next , *s=NULL;
	printf("The DoubleList is:\n");
	do
	{
   
		printf("%d\t",p->data);
		s=p;
		p=p->next;
		p->pre=s;
		s->next=p;
	}while(p!=dhead);
	printf("\n");
}

//创建链表,读入五个整数 
void Create5NumList(Node *head)
{
   
	Node *p=head,*s; 
	int i;
	printf("Please input 5 numbers:\n");
	for(i=0;i<5;i++)
	{
   
		s=(Node*)malloc(sizeof(Node));
		scanf("%d",&s->data);
		p->next=s;
		p=s;
	}
	p->next=NULL;
	printf("Input finished!\n");
	PrintList(head);
}

//创建双向链表
void CreatDoubleList(DoubleLinkList &dhead)
{
   
	int data=1;
	DoubleNode *p=dhead,*s=NULL;
	printf("Please input the data of DoubleList(end with 0):\n");
	while(data!=0)
	{
   
		scanf("%d",&data);
		if(data!=0)
		{
   
			s=(DoubleLinkList)malloc(sizeof(DoubleNode));
			s->data=data;
			s->pre=p;
			p->next=s;
			p=s;
		}
		else
		{
   
			s->next=dhead;
			dhead->pre=s;
		}
	}
	printf("Create success!\n");
	PrintfDoubleList(dhead);
}

//插入元素
int InsertData(LinkList &head)
{
   
	int pos,data;
	Node *s=NULL,*p=head;
	int i=0;
	printf("Please input the data and position:\n");
	scanf("%d %d",&data,&pos);
	while(p->next!=NULL && i<pos-1)
	{
   
		p=p->next;
		i++;
	}
	if(!p)
	{
   
		printf("Insert error!\n");
		return 0;
	}
	s=(Node*)malloc(sizeof(Node));
	s->data=data;
	s->next=p->next;
	p->next=s;
	printf("Insert success!\n");
	PrintList(head);
	return 1; 
} 

//删除元素
int  DeleteData(LinkList &head)
{
   
	int i=0;
	int pos;
	Node *s,*p=head;
	printf("Please input the position of the data you want to delete:\n")
  • 24
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值