zoukankan      html  css  js  c++  java
  • 单链表的实现

    单链表数据结构为:

    typedef struct Lnode
    {
    	ElemType data;       //该节点数据。头结点不存数据 
    	struct Lnode *next;  //指向下一节点指针 
    }LinkList;

    实现下列函数:

    void CreateListF(LinkList *&L,ElemType a[],int n);  //头插法建表
    void CreateListR(LinkList *&L,ElemType a[],int n); //尾插法建表
    void InitList(LinkList *&L);  //初始化单链表
    void DestroyList(LinkList *&L);  //销毁单链表
    int ListEmpty(LinkList *L);  //推断链表是否为空
    int ListLength(LinkList *L);  //求单链表长度
    void DispList(LinkList *L);  //输出单链表
    int GetElem(LinkList *L,int i,ElemType &e);  //求单链表里第i个节点的值,并赋值给e 
    int LocateElem(LinkList *L,ElemType e); //求与e值相等的第一个元素的序号 
    int InsertElem(LinkList *&L,int i,ElemType e); //插入元素
    int DeleteElem(LinkList *&L,int i,ElemType &e); //删除元素 
    

    实现代码:

    #include <stdio.h>
    #include <iostream> 
    #include <stdlib.h>
    #define ElemType char
    #define GET_ARRAY_LEN(array)   (sizeof(array)/sizeof(array[0])) 
    
    using namespace std;
    
    typedef struct Lnode
    {
    	ElemType data;       //该节点数据,头结点不存数据 
    	struct Lnode *next;  //指向下一节点指针 
    }LinkList;
    
    void CreateListF(LinkList *&L,ElemType a[],int n);  //头插法建表
    void CreateListR(LinkList *&L,ElemType a[],int n); //尾插法建表
    void InitList(LinkList *&L);  //初始化单链表
    void DestroyList(LinkList *&L);  //销毁单链表
    int ListEmpty(LinkList *L);  //推断链表是否为空
    int ListLength(LinkList *L);  //求单链表长度
    void DispList(LinkList *L);  //输出单链表
    int GetElem(LinkList *L,int i,ElemType &e);  //求单链表里第i个节点的值,并赋值给e 
    int LocateElem(LinkList *L,ElemType e); //求与e值相等的第一个元素的序号 
    int InsertElem(LinkList *&L,int i,ElemType e); //插入元素
    int DeleteElem(LinkList *&L,int i,ElemType &e); //删除元素 
    
    void CreateListF(LinkList *&L,ElemType a[],int n){
    	LinkList *s=NULL;
    	L=(LinkList *)malloc(sizeof(LinkList)); 
    	L->next=NULL;
    	for(int i=0;i<n;i++){
    		s=(LinkList *)malloc(sizeof(LinkList));
    		s->data=a[i];
    		s->next=L->next;
    		L->next=s; 
    	}
    }
    
    
    void CreateListR(LinkList *&L,ElemType a[],int n){
    	LinkList *s=NULL; 
    	L=(LinkList *)malloc(sizeof(LinkList)); 
    	L->next=NULL;
    	LinkList *p=L;
    	for(int i=0;i<n;i++){
    		LinkList *s=(LinkList *)malloc(sizeof(LinkList));
    		s->data=a[i];
    		s->next=NULL;
    		p->next=s;
    		p=p->next;
    	} 
    }
    
    void InitList(LinkList *&L){
    	L=(LinkList *)malloc(sizeof(LinkList));
    	L->next=NULL;
    }
    
    void DestroyList(LinkList *&L){
    	LinkList* p=L;
    	LinkList* pnext=p->next;
    	while(pnext!=NULL){
    		free(p);
    		p=pnext; 
    		pnext=pnext->next;
    	}
    	free(p);
    }
    
    int ListEmpty(LinkList *L){
    	return(L->next==NULL); 
    }
    
    int ListLength(LinkList *L){
    	LinkList* p=L;
    	int count=0;
    	while(p->next!=NULL){
    		 count++;
    		 p=p->next;
    	}
    	return count;
    }
    
    void DispList(LinkList *L){
    	LinkList *p=L->next;
    	while(p!=NULL){
    	cout<<p->data<<" ";
    	p=p->next;
    	}
    	cout<<endl;
    }
    
    int GetElem(LinkList *L,int i,ElemType &e){
    	int j=0;
    	LinkList *p=L;
    	while(j<i&&p!=NULL){
    		p=p->next;
    		j++; 
    	}
    	if(p==NULL||i<1)return -1;
    	else {
    		e=p->data;
    		return 1;
    	} 
    }
    
    int LocateElem(LinkList *L,ElemType e){
    	int i=1;
    	LinkList *p=L->next;
    	while(p!=NULL&&p->data!=e){
    		p=p->next;
    		i++;
    	}
    	if(p==NULL)return -1;
    	else return i;
    }
    
    int InsertElem(LinkList *&L,int i,ElemType e){
    	LinkList *p=L;
    	if(i<1||i>(ListLength(L)+1))return -1;
    	else {
    		for(int j=1;j<i;j++){
    			p=p->next;
    		}
    		LinkList* addNumber=(LinkList *)malloc(sizeof(LinkList));
    		addNumber->data=e;
    		addNumber->next=p->next; 
    		p->next=addNumber;
    		return 1;
    	} 
    }
    
    int DeleteElem(LinkList *&L,int i,ElemType &e){
    	LinkList *p=L;
    	int j=1;
    	while(j<i&&p!=NULL){
    		p=p->next;
    		j++;
    	}
    	if(i<1||p==NULL)return -1;
    	else{
    		LinkList *q=p->next;
    		if(q==NULL)return -1;
    		p->next=q->next;
    		e=q->data;
    		free(q);
    		return 1;
    	}
    	
    }
    
    int main(){
    	char a[]={'a','b','h','c','r','z','g','y'};
    	LinkList *L=NULL;	
    	ElemType e;	
    	CreateListF(L,a,GET_ARRAY_LEN(a));
    	DispList(L);
    	DestroyList(L);
    	CreateListR(L,a,GET_ARRAY_LEN(a));
        DispList(L);
        GetElem(L,4,e);
        cout<<e<<endl;
        cout<<LocateElem(L,e)<<endl;
        DeleteElem(L,7,e);
        DispList(L);
        InsertElem(L,1,'u');
        DispList(L);
        cout<<ListLength(L);
    	return 0;
    } 

    实现结果:


  • 相关阅读:
    GIS单词汇总
    ArcGIS Server 开发初步 自定义工具
    ArcGIS Server 9.2 实现基于web浏览器的在线编辑
    控制图层是否显示的方法
    地图缓存与瓦片切割步骤
    汉字转拼音缩写(VB版)
    VB的Winsock控件GetData方法获取汉字乱码解决方法
    柱状专题图实现例子
    汉字转拼音缩写(C#版)
    ArcGIS Server .NET ADF中的AJAX之深入浅出/CallbackResult详解
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7025833.html
Copyright © 2011-2022 走看看