数据结构学习---线性表链表实现

链表的实现(简易版)


首先是结构体

typedef int ElementType; //为了便于修改链表中元素的类型
typedef struct Node{
	ElementType Date;
	struct Node* Next;
}List;
List L,*Ptrl;


求链表长度的函数

int length(List *Ptrl){
	List* p =Ptrl;
	int j=0;
	while(p){
		p=p->Next;
		j++;
	}
	return j;
}

通过位置查找

List* FindKth(int k,List *Ptrl){
	List *p=Ptrl;
	int i=0;
	while(p!=NULL && i<k){ 
		p=p->Next;
		i++;
	}
	if(i == k) 
		return p;
	else 
		return NULL;

}


通过值查找


List* Find(ElementType X ,List* Ptrl){
	List* p =Ptrl;
	while(p!=NULL && p->Date!=X){
		p=p->Next;
	}
	return p;
}

插入

/*构造节点,找到i-1个节点,插入节点*/
List* Insert(ElementType X,int i ,List* Ptrl){ 
    List* s, * p;
    if(i==1){
        s=(List*)malloc(sizeof(List));
        s->Date = X;
        s->Next = Ptrl;
        return s;
    }
    p = FindKth(i-1,Ptrl);
    if(p== NULL){
        cout<<"参数错"<<endl;
        return NULL;
    }
    else{
        s=(List*)malloc(sizeof(List));
        s->Date = X;
        s->Next = p->Next;//位置不能颠倒
        p->Next = s;
        return Ptrl;
    }
}


删除

List* Delete(int i,List* Ptrl){
	List *p, *s;
	if(i==1){ //删除头结点
		s=Ptrl;
		if(Ptrl!=NULL)
			Ptrl=Ptrl->Next;
		else return NULL;
		free(s); //不要忘了释放空间
		return Ptrl;
	}
	p = FindKth(i-1,Ptrl);
	if(p== NULL){
		printf("第%d个节点不存在",i-1); 
		return NULL;
	}
	else if(p->Next == NULL){
		printf("第%d个节点不存在",i); 
		return NULL;
	}
	else{
		s=p->Next;//用新创建的指针指向要删除的
		p->Next = s->Next; 
		free(s);
		return Ptrl;
	}
}


【测试的主函数】

int main(){
	List* p=(List*)malloc(sizeof(List));
	p->Next = NULL;
	p->Date=2;
	p=Insert(5,1,p);
	p=Insert(3,2,p);
	p=Insert(5,2,p);
	cout<<"长度为:  "<<length(p)<<endl;
	List* po = FindKth(2,p);
	if(po==NULL)
		cout<<"不存在"<<endl;
	else{
		cout<<po->Date<<endl;
	}
	p=Delete(2,p);
	po = FindKth(2,p);
	if(po==NULL)
		cout<<"不存在"<<endl;
	else{
		cout<<po->Date<<endl;
	}
	return 0;
}


posted @ 2015-08-08 13:28  编程菌  阅读(212)  评论(0编辑  收藏  举报