您的位置:首页 > 理论基础 > 数据结构算法

数据结构 顺序表及合并

2013-07-27 12:51 369 查看


数据结构学得不怎么好,回来重新敲敲,学的java,对c不熟悉,感觉java对数据结构封装很好,像顺序表什么的,直接一个类就可以使用,根本不知道他究竟怎么来的,所谓数据结构与算法为程序灵魂,因为你看不到,没有这些东西,你哪来的那么多东西可用。所以还是回归基础。学这个,需要对c的指针和结构体部分有了解,不然只会一头雾水。


文件分开成main.c,SeqList.c,SeqList.h条理清晰一点。

SeqList.h



#include<stdio.h>
#include<malloc.h>
typedef int DataType;
struct SeqList{
	int n;
	int Maxnum;
	DataType *element;
};

typedef struct SeqList *PSeqList;

PSeqList createSeqList(int m);//创建表 
int searchElement(PSeqList pseqlist,DataType element);//搜索某个元素 
int insertForward(PSeqList pseqlist,int position,DataType element);//元素前插入
int insertBack(PSeqList pseqlist,int position,DataType element);//元素后插入
int deleteElement(PSeqList pseqlist,DataType element);
int printfAll(PSeqList pseqlist);//打印全部 
int isNullList(PSeqList pseqlist);//判断是否为空 
PSeqList combineAnotherList(PSeqList one,PSeqList another);

 



SeqList.c




#include "SeqList.h "
PSeqList createSeqList(int m){
	PSeqList pseqlist = (PSeqList)malloc(sizeof(struct SeqList));
	if(pseqlist != NULL){
		pseqlist->element = (DataType*)malloc(sizeof(DataType) *m);
		if(pseqlist-> element != NULL){
			pseqlist -> Maxnum = m;
			pseqlist -> n = 0;
			return pseqlist;
		}
	}
	printf("Create SeqList fail!");
	return NULL;
} 

int isNullList(PSeqList pseqlist){
	return (pseqlist ->n ==NULL);// true is 1 ,false is 0	
}

int searchElement(PSeqList pseqlist,DataType element){
	int i = 0 ;
	for(i;i < pseqlist ->n;i++){
		if(pseqlist -> element[i] == element){
			printf("%d element is the %dth element in the list\n",element,i);
			return 0;
		} 
	}
	if(i>=pseqlist->n)
		printf("the element value %d  does not exist!\n",element);
	return -1;
}

int insertForward(PSeqList pseqlist,int position,DataType element){
	int i;
	if(pseqlist->n > pseqlist->Maxnum)
		printf("overflow!");
		
	if(position < 0 || position > pseqlist->n) 
	    return 0;
	
	pseqlist ->element[position] = element;
	
	for(i=pseqlist->n;i >=position ;i--){
		pseqlist -> element[i+1] = pseqlist->element[i];
		pseqlist -> n ++ ;
	}
	return 1;
}//元素前插入,指定位置,插入多少 

int insertBack(PSeqList pseqlist,int position,DataType element){
	int i;
	if(pseqlist->n > pseqlist->Maxnum)
		printf("overflow!");
		
	if(position < 0 || position > pseqlist->n) 
	    return 0;
	
	pseqlist ->element[position+1] = element;
	
	for(i = pseqlist-> n;i >= position+1 ;i--){
		pseqlist -> element[i+1] = pseqlist->element[i];
		pseqlist ->n ++ ;
	}
	return 1;
}//元素后插入,指定位置,插入多少 

int deleteElement(PSeqList pseqlist,DataType element){
	int i = 0 ,j;
	for(i;i < pseqlist ->n;i++){
		if(pseqlist -> element[i] == element) {
			for(j=i;j < pseqlist->n	 ;j++){
				pseqlist -> element[j] = pseqlist->element[j+1];				
			}
			pseqlist ->n -- ;
			printf("the element value %d is deleted\n",element,i);
			return 0;
		} 
	}
	if(i>=pseqlist->n)
		printf("the element value %d  does not exist!\n",element);
	return -1;
	
}

int printfAll(PSeqList pseqlist){
	int i = 0 ;
	if(isNullList(pseqlist) == 1)
		printf("the list is a nulllist!");
	for(i;i < pseqlist ->n;i++){
		printf("%3d",pseqlist->element[i]); 
	}
	printf("\n");
}
PSeqList combineAnotherList(PSeqList one,PSeqList another){
    int q = one ->n + another ->n;
    int i = one ->n;
    int j = 0;
    PSeqList combinelist = createSeqList(q+50);
    combinelist ->n = q;
        
    for(i,j;j<i;j++){
        combinelist ->element[j] = one->element[j];
    }
    for(i,j=0;i<=q;i++,j++){
        combinelist ->element[i] = another->element[j];
        //bug : j = 0 j is chaged in the first for! 
    }
    
    return combinelist;
} 



main.c




#include "SeqList.h"
#include<stdio.h> 
int main(){
	int i,j,n,d,s;
	PSeqList pseqlist;
	printf("input the length the list, for example 12 ,33 and so on  :");
	scanf("%d",&n);
    pseqlist = createSeqList(n+50);
	printf("\n input %d number,use space to divide them:\n");
	
	for(i = 0;i<n;i++){
		scanf("%d",&j);
		insertForward(pseqlist,i,j);
	}
		
		
	printf("show all the element:\n");
	printfAll(pseqlist);
	
	printf("which  element do you want to search input its value :\n");
	scanf("%d",&s);
	searchElement(pseqlist,s);
	
	printf("which  element do you want to delete input its value :\n");
	scanf("%d",&d);
	deleteElement(pseqlist,d);
	printf("show the elements after deleting:\n");
	printfAll(pseqlist);
	return 0;
}



先说一下遇到的几个小问题:



1.include ""是先从本地目录开始寻找,然后去寻找系统路径,Include <> 相反先从系统目录,后从本地目录。是有区别的。



2.用的是CFree,如果你遇到编译出现 未找到“g++.exe”的问题,就装个MinGW,或者直接用VC6.0开始编译。



3.谭浩强书里的结构体是不需要malloc的,当时在想为什么数据结构要用malloc,原来,这个涉及到堆栈的区别,结构体直接写后栈会帮你分配相应的空间,函数结束返回后便释放。而malloc是自己在堆里分配的内存,记得用free释放,引用那个前辈的比喻,就是malloc就是你自己做菜,想怎么做就怎么做,很自由,好不好吃取决于你的手艺,而栈就是你自己定餐,比较固定。

用回数据结构,当然用自己自由地分配空间,自定义的结构。所以用了malloc。之前真不知道,还好有人指点。



4. typedef struct SeqList *PSeqList;,将PSeqList定义为指向SeqList的指针变量。作用就是方便,因为后面用到结构体的变量时,你不需要SeqList.xx东西,而用PSeqList ->xx ,指向什么,也有网上说



类似于数组指针比数组更易于操作一样(如排序问题),结构体指针比结构体本身更加的易于操作。更强的通用性一些早期的C语言实现不支持将结构体变量作为参数传递给函数,但是结构体指针变量却可以。

之前这样想,但是发现错了,本身malloc返回的就是void *,只有指针的东西才这样分配,如果 typedef struct SeqList *PSeqList;不写这个,后面定义变量就麻烦很多。


5. 一开始对pseqlist->element = (DataType*)malloc(sizeof(DataType) *m); 也很不理解, 其实DataType是我们自己指定的类型,例如typedef int DataType; 分配n个int空间,也就是数组了,转换成int 指针类型,因为element 也是指针类型,这样element就拿到这个空间的首地址,和数组相同。

其他问题自己消化,现在就知道所谓的ArrayList,LinkList类大概的原理怎么回事,每天光顾着用,原理背地里这么个实现法。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: