顺序表的建立,初始化,插入以及删除操作。
输入:表的各个结点的值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);
}
今天学习了顺序表的一些例题,也尝试了用不同的方法解决问题,明天会继续学习数据结构中栈的内容。