线性表及其应用 (C语言)

实验内容

任务一

根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作:
① 查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。
② 删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为e 的元素。
③ 插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。

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

typedef struct  _node
{ 
    int data; //data field
    struct _node* next;  //pointer field
}node,*link_node;
/*
l-next
l->data
l->next->data
*/
//尾插法创建的单链表
void create_list(link_node &head,int a[],int n)
{
	node *p,*tail;  //p用来指向新的结点,tail用来指向终端结点
	head=(link_node)malloc(sizeof(node)); //链表分配空间
	tail=head;  //tail始终指向结点的尾部
	for(int i=0;i<n;i++)
	{
		p=(link_node)malloc(sizeof(node));  //为p结点分配空间
		p->data=a[i];   //赋值新结点
		tail->next=p;
		tail=p;    //tail始终指向结点的尾部 
	 } 
	 tail->next=NULL; 
} 
//find elements
int find(link_node l,int i,int &position,int n)
{
	link_node p=l;
	int j=0;
	while(p->data!=i)  //目前的前一位
	{
		j++;
		p=p->next;
	}	
}
//delete elements
void det(link_node l,int i,int &E)
{
	link_node p=l;
	if(p->next->data!=i) 
	{
		p=p->next;
	}
	link_node q=p->next;
	p->next=q->next;
	E=q->data;
	free(q); //free elements space
}
//insert elements
int insert(link_node &l)
{
	int i=0,e=0,j=1;
	printf("please enter the location that you want to insert:");
	scanf("%d",&i);
	printf("please enter the inserted elements:");
	scanf("%d",&e);
	link_node q=l;  //q points to head
	while(j<i)
	{
		 ++j;
		 q=q->next;
	}
	link_node p=(link_node)malloc(sizeof(node));
	p->data=e;
	p->next=q->next;
	q->next=p;
	return true;
}
//output elements
void print(link_node l)
{
    node *temp=l;
    printf("the elements of the single linked list:");
    while(temp->next)
    {
        temp=temp->next;
        printf("%d\t",temp->data);
    }   
	printf("\n"); 
}
int main()
{
    link_node  l; 
    //创建列表
	int n,a[n],i,e=0,position=0,p=0;  //不知道为啥,不加这几个就会出错
    printf("please enter the number of elements:");
    scanf("%d",&n);
	for(i=0;i<n;i++)
	{	
		scanf("%d",&a[i]);
	}
	create_list(l,a,n);
    print(l);  //print the single linked list
	//find elements
	int j=0;
	printf("please enter which elements you want to find:");
	scanf("%d",&j);
	find(l,j,position,n);
	printf("the location of elements that you want to find is %d\n",position);
	//delete elements
	int k=0;
	printf("please enter which elements you want to delete:");
	scanf("%d",&k);
	det(l,k,e);
	print(l);
	//insert elements
	insert(l);
	print(l);
    return 0;
}

任务二

顺序表的创建、插入、查找、删除

#include<stdio.h>
#include<stdlib.h>
#define  maxsize 100
#define increment 10  //Additional memory

typedef struct
{
    int *elem; //the first address of memory
    int length;
    int size;
}sqlist;
/*
l.elem   first address
l.length   
l.elem[0]
l.elem[l.length-1]
l.size 
*/
//initialization
int init_l(sqlist &l)
{
    int len;
    l.elem=(int *)malloc(maxsize*sizeof(int));  
    if(!l.elem)  //内存不足
    {
        return false; 
    }
    printf("please enter the length of teble:");
    scanf("%d",&len);
    l.length=len;
    l.size=maxsize;
    for(int i=0;i<l.length;i++)
    {
        scanf("%d",&l.elem[i]);  
    }
    //冒泡排序法进行排序
	//冒泡排序法
	for(int i=0;i<l.length-1;i++)
	{
		for(int j=0;j<l.length-1-i;j++)
		{
			if(l.elem[j]>l.elem[j+1]) //如果遇到大于自己的数 
			{
				int temp=l.elem[j];
				l.elem[j]=l.elem[j+1];
				l.elem[j+1]=temp;
			} 			
		} 
	}
   
}
//insert elements
int insert(sqlist &l)
{
    int i,e;
    printf("please enter the location you want to insert:");
    scanf("%d",&i);
    printf("please enter the elements you want to insert:");
    scanf("%d",&e);    
    if(i<1 || i>l.length)  //judge whether it is legal
    {
        printf("illegal location");
        return false;
    }
    if(l.length==l.size)  //memory full
    {
        int *base=(int *)realloc(l.elem,(l.size+increment)*sizeof(int)); //Allocate a new space
        l.elem=base;
    }
    for(int j=l.length-1;j>=i-1;--j)
    {
        l.elem[j+1]=l.elem[j];
    }
    l.elem[i-1]=e;
    l.length++;  
}
//delete
int det(sqlist &l)
{
    int e,i=0,E;
    printf("please enter the elements you want to delete:");
    scanf("%d",&e);   
    while(l.elem[i]!=e)
    {
        i++;
    }
    E=l.elem[i];
    //printf("%d\n",E);
    for(i;i<l.length-1;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.length--;
    return true;
}
//find
int find(sqlist l)
{
    int i=0,e;
    printf("please enter the elements you want to find:");
    scanf("%d",&e);
    while(i<=l.length-1)
    {
        if(l.elem[i]==e)  //find the target elements
        {
            printf("the location of found elements is:%d\n",i+1);
            return false;
        }
        i++;
    } 
    if(i>=l.length)
    {
        printf("there is no target elements in the table\n");
        return false;
    }
}
//print
int print(sqlist l)
{
    printf("the elements of table:");
    for(int i=0;i<l.length;i++)
    {
        printf("%3d",l.elem[i]);
    }
    printf("\n");
    return true;
}
//main fuction 
int main()
{
    sqlist l,a,b;
    init_l(l);
    print(l);
    //insert elements
    insert(l);
    print(l);
    //delete
    det(l);
    print(l);
    //find
    find(l);
    print(l);
}

任务三

首先创建L顺序表和A顺序表,然后通过冒泡排序法,将两个顺序表进行排序,
再创建B空顺序表,然后将L和A顺序表合并至B顺序表,再通过冒泡排序法将B顺序表进行派排序。最后遍历输出排序后的顺序表。

#include<stdio.h>
#include<stdlib.h>
#define  maxsize 100
#define increment 10  //Additional memory

typedef struct
{
    int *elem; //the first address of memory
    int length;
    int size;
}sqlist;
/*
l.elem   first address
l.length   
l.elem[0]
l.elem[l.length-1]
l.size 
*/
//initialization
int init(sqlist &l)
{
    int len;
    l.elem=(int *)malloc(maxsize*sizeof(int));  
    if(!l.elem)  //内存不足
    {
        return false; 
    }
    printf("please enter the length of teble:");
    scanf("%d",&len);
    l.length=len;
    l.size=maxsize;
    for(int i=0;i<l.length;i++)
    {
        scanf("%d",&l.elem[i]);  
    }
    //冒泡排序法进行排序
	//冒泡排序法
	for(int i=0;i<l.length-1;i++)
	{
		for(int j=0;j<l.length-1-i;j++)
		{
			if(l.elem[j]>l.elem[j+1]) //如果遇到大于自己的数 
			{
				int temp=l.elem[j];
				l.elem[j]=l.elem[j+1];
				l.elem[j+1]=temp;
			} 			
		} 
	}
   
}
//conbine table
int conbine(sqlist l,sqlist a,sqlist &b)
{
    int k=0,m=0,j=0;
    b.elem=(int *)malloc(maxsize*sizeof(int));  //Allocate new space
    b.length=l.length+a.length;
    b.size=l.size+a.size;
    while(m<=l.length-1)
    {
        b.elem[k]=l.elem[m];
        m++;
        k++;
    }
    while(j<=a.length-1)
    {
        b.elem[k]=a.elem[j];
        j++;
        k++;
    }
    //排序
	for(int i=0;i<b.length-1;i++)
	{
		for(int j=0;j<b.length-1-i;j++)
		{
			if(b.elem[j]>b.elem[j+1]) //如果遇到大于自己的数 
			{
				int temp=b.elem[j];
				b.elem[j]=b.elem[j+1];
				b.elem[j+1]=temp;
			} 			
		} 
	}
}
//insert elements
int insert(sqlist &l)
{
    int i,e;
    printf("please enter the location you want to insert:");
    scanf("%d",&i);
    printf("please enter the elements you want to insert:");
    scanf("%d",&e);    
    if(i<1 || i>l.length)  //judge whether it is legal
    {
        printf("illegal location");
        return false;
    }
    if(l.length==l.size)  //memory full
    {
        int *base=(int *)realloc(l.elem,(l.size+increment)*sizeof(int)); //Allocate a new space
        l.elem=base;
    }
    for(int j=l.length-1;j>=i-1;--j)
    {
        l.elem[j+1]=l.elem[j];
    }
    l.elem[i-1]=e;
    l.length++;  
}
//delete
int det(sqlist &l)
{
    int e,i=0,E;
    printf("please enter the elements you want to delete:");
    scanf("%d",&e);   
    while(l.elem[i]!=e)
    {
        i++;
    }
    E=l.elem[i];
    //printf("%d\n",E);
    for(i;i<l.length-1;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.length--;
    return true;
}
//find
int find(sqlist l)
{
    int i=0,e;
    printf("please enter the elements you want to find:");
    scanf("%d",&e);
    while(i<=l.length-1)
    {
        if(l.elem[i]==e)  //find the target elements
        {
            printf("the location of found elements is:%d\n",i+1);
            return false;
        }
        i++;
    } 
    if(i>=l.length)
    {
        printf("there is no target elements in the table\n");
        return false;
    }
}
//print
int print(sqlist l,char str[])
{
    printf("the elements of table %s:",str);
    for(int i=0;i<l.length;i++)
    {
        printf("%3d",l.elem[i]);
    }
    printf("\n");
    return true;
}
//main fuction 
int main()
{
    sqlist l,a,b;
    char L[]="l",A[]="a",B[]="b";
    int grade,j=0;
    init(l);
    print(l,L);
    init(a);
    print(a,A);
    conbine(l,a,b);
    print(b,B);
    printf("1.insert elements\n2.delete elements\n3.find elements\n4.exit\n");
    printf("please enter the fuction that you want:");
    scanf("%d",&grade);
    while(j<4)
    {
        switch (grade)
        {
        case 1:
            //insert elements
            insert(b);
            print(b,B);
            break;
        case 2:
            //delete
            det(b);
            print(b,B);
        case 3:
            //find
            find(b);
            print(b,B);
        case 4:
            printf("exit!");
            break;
        default:
            printf("input error!!!");
            break;
        }  
        j++;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值