数据结构第二周作业(线性表的增删改查、链表)

1.
(1)顺序存储结构和链式存储结构的优缺点

顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。

  • 优点:存储空间利用率高。
  • 缺点:插入或删除元素时不方便。

链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针.

  • 优点:插入或删除元素时很方便,使用灵活。
  • 缺点:存储密度小(<1),存储空间利用率低。
(2)使用情况

顺序表适宜于做查找这样的静态操作;
链表宜于做插入、删除这样的动态操作。

若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。

(3)顺序表与链表的比较
  • 基于空间的比较

  • 存储分配的方式
    顺序表的存储空间是静态分配的

    • 链表的存储空间是动态分配的
    • 存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量
      • 顺序表的存储密度 = 1
      • 链表的存储密度 < 1
  • 基于时间的比较

  • 存取方式
    顺序表可以随机存取,也可以顺序存取

    • 链表是顺序存取的
    • 插入/删除时移动元素个数
      • 顺序表平均需要移动近一半元素
      • 链表不需要移动元素,只需要修改指针
2.

顺序表A,长度为n,请设计一个算法,删除表A中所有的值为b的元素?

#include <stdio.h>

int L_Delete (int *A, int n, int b);

int main(){
    int A[] = {3,1,2,3,4,5,3,6,7,8,3};
    int n=sizeof(A)/sizeof(A[0]);
    int num = L_Delete(A,n,3);
    for(int i=0;i<num;i++){
        printf("%d ",A[i]);
    }
    return 0;
}

int L_Delete (int *A, int n,int b){ /* A是线性表,n是表长,i是删除位置 */
  /* y用于保存将要删除的第i个元素 */
    if (n>0){
        int i;
        for (i=0; i<n; i++){
            if(A[i]==b){
                int j;
                for(j=i;j<n;j++){
                    A[j] = A[j+1];   /* 移动元素 */
                }
                n -= 1;  /*修正表长 */
                //printf("n=%d\n",n);
            }
        } 
    } 
    return n;
} /* 算法结束 */

在这里插入图片描述

3.

顺序表A长度为m,顺序表B长度为n,表A和B中的元素均按递增顺序排列,请编写一个算法,将A和B合并为新的序列C 。

#include <stdio.h>
#define N1 sizeof(A)/sizeof(A[0])
#define N2 sizeof(B)/sizeof(B[0])

void L_sort(int *A, int n);
//void L_com(int *A,int *B,int *C,int n);

int main(){
    int A[] = {1,3,5,7,9};
    int B[] = {2,4,6,8,10};
    int n = N1 + N2;
    int C[n];
    int i;

    for(i=0;i<N1;i++){
        C[i] = A[i];
        printf("%d ",C[i]);
    }
    for(i=N1;i<n;i++){
        C[i] = B[i-N1];
        printf("%d ",C[i]);
    }
    //L_com(A,B,C,n);
    L_sort(C,n);
    printf("\n");
    for(i=0;i<n;i++){
        printf("%d ",C[i]);
    }
}
void L_sort(int *C,int n){
    int i,j;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(C[i]>C[j]){
                int k=C[i];
                C[i] = C[j];
                C[j] = k;
            }
        }
    }
}

在这里插入图片描述

4.

线性表A,长度为n,采用链式存储结构,表头指针为H,请设计一个算法,删除链表H中元素值为b的所有结点。

#include <stdlib.h>
#include <stdio.h>
#define N sizeof(A)/sizeof(A[0])

struct node{	
    int Data;
	 struct node *Link;
} *H;

struct node *del(struct node *list, int b);
struct node *add_to_list(struct node *list,int b);

void main(){  
    int A[]={25,73,60,37,98,90,24};
    int i;
    printf("数组中元素值作为输入:\n");
    for (i=0; i<N; i++){
        printf("%5d",A[i]);  
    }
    struct node *first =NULL;
    for (i=0; i<N; i++){
        first = add_to_list(first,A[i]);
    }
    printf("\n打印链表中的结点元素:\n");
    
    struct node *p = first;
    while (first!=0) {printf("%5d",first->Data); first=first->Link;}
    int flag = 37; 
    struct node *q = del(p,flag);
    printf("\n打印删除%3d结点后的链表元素:\n",i);  

    while (q!=0) {printf("%5d",q->Data); q=q->Link;}  
    printf("\n");
}

struct node *add_to_list(struct node *list,int b){
    struct node *new_node;
    new_node = malloc(sizeof(struct node));
    if(new_node == NULL){
        printf("Error!");
        exit(EXIT_FAILURE);
    }
    new_node->Data = b;
    new_node->Link = list;
    return new_node;
}

struct node *del(struct node *list, int b){
    struct node *cur,*prev;
    for(cur=list,prev=NULL;cur!=NULL&&cur->Data!=b;prev=cur,cur=cur->Link);
    if(cur==NULL) return list;
    if(prev==NULL) list = list->Link;
    else prev->Link = cur->Link;

    free(cur);
    return list;
}

在这里插入图片描述

5.

线性表A,长度为n,采用链式存储结构,表头指针为H,请设计一个算法,删除链表H中元素值为b的所有结点。

#include<stdio.h>
#include<stdlib.h> 
#define N 10
typedef struct node{
	int data;
	struct node* next;
}ElemSN;
 
//创建一个单向链表 
ElemSN* CreatLink(int a[],int n)
{
	ElemSN *head,*tail,*p;
	head=NULL;
	for(int i=0;i<n;i++)
	{
		p=(ElemSN*)malloc(sizeof(ElemSN));
		p->data=a[i];
		p->next=NULL;
		if(!head)
	    {
	    	head=tail=p;
	    	tail->next=NULL;
		}
	    else
	    {
	    	tail=tail->next=p;
	    	tail->next=NULL;
		}
	}
	return head;
 } 
 
 
 //删除重复值
 ElemSN* DelSameNode(ElemSN *head)
 {
 	ElemSN *Pkey,*p,*q;
 	Pkey=head;
 	while(Pkey)
 	{
 		q=Pkey;
 		p=Pkey->next;
 		while(p)
 		{
 		    if(p->data-Pkey->data)
 	    	{
 			    q=p;
 			    p=p->next;
	    	}
		    else
		    {
		    	q->next=p->next;
				p=q->next;	
			}
		 }
		 Pkey=Pkey->next;
	}
	return head;
 } 
 
   //打印删除结点后的链表  
  void PrintLink(ElemSN* head)
 {
 	ElemSN *p=head;
 	for(;p;p=p->next)
 	printf("%5d",p->data);
 }
 
 int main(void)
 {
 	ElemSN *head;
 	int a[N]={3,2,3,8,4,3,4,9,2,3};
 	head=CreatLink(a,N);  //创建单向链表,返回头指针
	head=DelSameNode(head);   //删除链表中数据域值重复的结点 
	PrintLink(head);   //打印删除结点之后的链表 
 }

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cachel wood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值