学习c语言的第十九天

顺序表的建立,初始化,插入以及删除操作。

输入:表的各个结点的值num,在第n个位置插入数字e,删除第n个位置的数字。

输出:初始化后的表的各个结点的值,插入数字e后的表的各个结点的值,删除第n个位置的数字后的表的各个结点的值。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#include <stdbool.h>
typedef struct LNode * list;
struct LNode{
	int data[maxsize];
	int length;
};

list initlist(){//建表操作 
	list l=(list)malloc(sizeof(struct LNode));
	l->length=-1;
	list l1=l; 
	int num,i=0;
	printf("请输入顺序表各结点的值");
	scanf("%d",&num);
	while(num!=-1){
		l->data[i]=num;
		i++;
     	scanf("%d",&num);
		l->length++;		
	}
	return l1;
} 

int print (list l){
	int i;
	for(i=0;i<=l->length;i++){
		printf("%d ",l->data[i]);
	}
} 

list insert(list l, int n,int e){//在第n个位置上插入
	if(l->length+1==maxsize){
		return false;
	} 
	if(n>l->length+2){
		return false;
	}
	list l1=l;
	int i=0;
	for(i=l->length;i>=n-1;i--){
		l->data[i+1]=l->data[i];
	}
	l->data[n-1]= e;
	l->length++;
	return l1;
}

list dlete(list l,int n){
	//删除第n个位置的值
	if(n>l->length+1){
		printf("越界"); 
		return 0;
	} 
	list l1=l;
	int i=n;
	for(i;i<=l->length;i++){
		l->data[i-1]=l->data[i];
	}
	l->length--;
	return l1;
}


int main (){
	list l=initlist();
	printf("\n"); 	
	printf("表的值为:");
	print(l);
	printf("要在第几个位置插入:");
	printf("插入的值为:");
	int position,n; 
	scanf("%d %d",&position,&n); 
	list l1=insert(l,position,n);
    printf("\n"); 
    printf("插入后的表的值为:");
    print(l1); 
    printf("要删除第几个位置的值:");
	scanf("%d",&n); 
	printf("\n");
	printf("删除后的表的值为:");
    list l2=dlete(l1,n);
    printf("\n"); 
    print(l2);
    
}

 删除顺序表的重复值

输入:表的各个结点的值。

输出:初始化后的表的各个结点的值,删除重复的值后的表的各个结点的值。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#include <stdbool.h>
typedef struct LNode * list;
struct LNode{
	int data[maxsize];
	int length;
};

list initlist(){//建表操作 
	list l=(list)malloc(sizeof(struct LNode));
	l->length=-1;
	list l1=l; 
	int num,i=0;
	printf("请输入顺序表各结点的值");
	scanf("%d",&num);
	while(num!=-1){
		l->data[i]=num;
		i++;
     	scanf("%d",&num);
		l->length++;		
	}
	return l1;
} 

int print (list l){
	int i;
	if(l->length==-1){
		printf("NULL");
		return 0;
	} 
	for(i=0;i<=l->length;i++){
		printf("%d ",l->data[i]);
	}
} 

list dlete(list l){
	if(l->length==-1){
		printf("表为空");
		return 0;
	}
	int i,j,k;
    for(i=0;i<l->length;i++){
    	for(j=i+1;j<=l->length;j++){
    		if(l->data[i]==l->data[j]){
    			for(k=j;k<l->length;k++){
    				l->data[k]=l->data[k+1];
				}
				l->length--; 
			}
			j--;
		}
	} 
	return l;
}


int main (){
	list l=initlist();
	printf("\n"); 	
	printf("表的值为:");
	print(l);
	printf("\n"); 
	printf("删除后表的值为:");
    list l1=dlete(l);
    print(l1);
    
}

将两个无序的顺序表合并为有序顺序表

方法有两种:

第一种:先让两个顺序表表内排序,再合并为一个有序的新顺序表。

输入:表1和表2的各个结点的值。

输出:表1的各个结点的值,表2的各个结点的值,排序后表1的各个结点值,排序后表2的各个结点的值,合并后表的各个结点的值。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#include <stdbool.h>
typedef struct LNode * list;
struct LNode{
	int data[maxsize];
	int length;
};

list initlist(){//建表操作 
	list l=(list)malloc(sizeof(struct LNode));
	l->length=-1;
	list l1=l; 
	int num,i=0;
	printf("请输入顺序表各结点的值");
	scanf("%d",&num);
	while(num!=-1){
		l->data[i]=num;
		i++;
     	scanf("%d",&num);
		l->length++;		
	}
	return l1;
} 

int print (list l){
	int i;
	if(l->length==-1){
		printf("NULL");
		return 0;
	} 
	for(i=0;i<=l->length;i++){
		printf("%d ",l->data[i]);
	}
} 

list sort(list l){
    if(l->length==-1){
    	return l;
	}
	int i,j;
	for(i=0;i<l->length;i++){
		for(j=i+1;j<=l->length;j++){
			if(l->data[i]>l->data[j]){
				int tmp=l->data[i];
				l->data[i]=l->data[j];
				l->data[j]=tmp;
			}
		}
	}
	return l;
	
}
list merge(list l1,list l2){
	if(l1->length==-1&&l2->length==-1){
		return l1;
	}
	if(l1->length==-1){
		return l2;
	}
	if(l2->length==-1){
		return l1;
	}
	list l3=(list)malloc(sizeof(struct LNode));
	l3->length=-1;
	int i=0,j=0,k=-1;
	while(i<=l1->length&&j<=l2->length){
		if(l1->data[i]<l2->data[j]){
			l3->length++;
			k++;
			l3->data[k]=l1->data[i];
			i++;
		}else {
			k++;
			l3->data[k]=l2->data[j];
			l3->length++;
			j++;
		}
	}
	int q;
	while(i<=l1->length){
		l3->length++;
		k++;
		l3->data[k]=l1->data[i];
		i++;
	}
	while(j<=l2->length){
		l3->length++;
		k++;
		l3->data[k]=l2->data[j];
		j++;
	}
	return l3;
} 

int main (){
	list l1=initlist();
	list l2=initlist();
	printf("\n"); 	
	printf("表1的值为:");
	print(l1);
	printf("\n");	
	printf("表2的值为:");
	print(l2);
	printf("\n"); 
	printf("排序后表1的值为:");
	list l11=sort (l1);
	print(l11);
	printf("\n"); 
	printf("排序后表2的值为:");
	list l22=sort (l2);
	print(l22);
	printf("\n"); 
	printf("合并后表的值为:");
	list l3=merge(l1,l2);
	print(l3);
}

第二种:直接合并,再进行表内排序。

输入:表1和表2的各个结点的值。

输出:表1的各个结点的值,表2的各个结点的值,合并后表的各个结点的值,排序后表的各个结点值。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#include <stdbool.h>
typedef struct LNode * list;
struct LNode{
	int data[maxsize];
	int length;
};

list initlist(){//建表操作 
	list l=(list)malloc(sizeof(struct LNode));
	l->length=-1;
	list l1=l; 
	int num,i=0;
	printf("请输入顺序表各结点的值");
	scanf("%d",&num);
	while(num!=-1){
		l->data[i]=num;
		i++;
     	scanf("%d",&num);
		l->length++;		
	}
	return l1;
} 

int print (list l){
	int i;
	if(l->length==-1){
		printf("NULL");
		return 0;
	} 
	for(i=0;i<=l->length;i++){
		printf("%d ",l->data[i]);
	}
} 

list sort(list l){
    if(l->length==-1){
    	return l;
	}
	int i,j;
	for(i=0;i<l->length;i++){
		for(j=i+1;j<=l->length;j++){
			if(l->data[i]>l->data[j]){
				int tmp=l->data[i];
				l->data[i]=l->data[j];
				l->data[j]=tmp;
			}
		}
	}
	return l;
	
}
list merge(list l1,list l2){
	if(l1->length==-1&&l2->length==-1){
		return l1;
	}
	if(l1->length==-1){
		return l2;
	}
	if(l2->length==-1){
		return l1;
	}
	int count =0;
	int x=0;
	int k=l1->length+1; 
    while(count<=l2->length){
    	l1->data[k]=l2->data[x];
    	x++;
    	count++;
    	k++;
    	l1->length++;
	}
	return l1;
} 

int main (){
	list l1=initlist();
	list l2=initlist();
	printf("\n"); 	
	printf("表1的值为:");
	print(l1);
	printf("\n");	
	printf("表2的值为:");
	print(l2);
	printf("\n"); 
	printf("合并后表的值为:");
	list l3=merge(l1,l2);
	print(l3);
	printf("\n"); 
	printf("排序后表的值为:");
	list l4=sort(l3);
	print (l4);
}

今天学习了顺序表的一些例题,也尝试了用不同的方法解决问题,明天会继续学习数据结构中栈的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值