zoukankan      html  css  js  c++  java
  • 【复习数据结构】单链表的操作

    #include <stdio.h>
    #include <malloc.h>
    typedef char ElemType;
    typedef struct LNode{	//定义单链表结点类型
    	ElemType data;		//数据域
    	struct LNode *next;	//指针域
    }LNode,*LinkList;
    
    /**
    *	头插法初始化链表
    **/
    LinkList CreateListhead(void){
    	char ch;
    	LinkList L;		//初始化链表
    	LNode *p;			//用来存放当前申请结点	
    	L=NULL;
    	ch=getchar();
    	while(ch!='
    '){
    		p=(LNode*)malloc(sizeof(LNode));
    		p->data=ch;
    		p->next=L;
    		L=p;
    		ch=getchar();
    	}
    	return L;		//返回的是链表
    }
    /**
    *	尾插法初始化链表
    **/
    LinkList CreateListTail(void){
    	char ch;
    	LinkList L;
    	LNode *p,*r;		//r为尾指针
    	L=NULL;
    	r=NULL;
    	ch=getchar();
    	while(ch!='
    '){
    		p=(LNode*)malloc(sizeof(LNode));
    		p->data=ch;
    		if(L==NULL){	//L为空插入第一个结点
    			L=p;
    		}else{
    			r->next=p;	//1 先把p接上,接到r所指向结点的后面
    		}
    		r=p;			//2 再把尾指针指向p,方便插入下一个结点
    		if(r!=NULL){
    			r->next=NULL;
    		}
    		ch=getchar();
    	}
    	return L;
    }
    /**
    *	根据位置获取元素
    **/
    LNode *GetElem(LinkList L,int i){
    	int j=1;			//计数
    	LNode *p=L;			//p指向的就是第一个结点
    	while(p->next&&j<i){		//这里判断p和判断p->next的作用
    		p=p->next;
    		j++;
    	}
    	if(i==j){
    		printf("%c
    ",p->data);
    		return p;
    	}else{
    		return NULL;
    	}
    }
    /**
    *	根据值获取元素
    **/
    LNode *LocateElem(LinkList L,ElemType e){
    	LNode *p=L->next;
    	while(p!=NULL&&p->data!=e){
    		p=p->next;
    	}
    	printf("%c
    ",p->data);
    	return p;
    }
    
    /**
    *	链表的插入实现方法之一:尾插法
    **/
    void InsertNode(LinkList L,ElemType e,int index){
    	int j=1;
    	LNode *p=L,*newnode;		//p指针遍历当前结点,newnode用于存放新结点
    	while(p->next&&j<index){
    	p=p->next;
    	j++;
    	}
    	
    	newnode=(LNode*)malloc(sizeof(LNode));
    	newnode->data=e;
    	p->next=newnode;
    	p=newnode;
    
    }
    /**
    *	根据索引删除结点
    **/
    void DeleteNode(LinkList L,int index){
    	int j=1;
    	LNode *p=L,*temp;	//临时指针用来存放删除结点
    	while(p->next&&j<index-1){
    		p=p->next;
    		j++;
    	}
    	if(j==index-1){
    		//删除当前p所指向结点的下一个结点
    		temp=p->next;
    		p->next=temp->next;
    		free(temp);
    
    	}
    }
    
    /**
    *	合并单链表 直接将一个list链接到另一个表表尾
    **/
    LNode Concatenate(LinkList A,LinkList B){
    	LNode *temp;
    	if(A == NULL){
    		return B;
    	}else{
    		if(B != NULL){
    			for(temp = A; temp->next; temp = temp->next);//遍历到链表A的末尾
    			temp->next = B;
    		}
    	}
    }
    /**
    *	合并两个从小到大的有序单链表 并将链表中data域仍按照从小到大顺序排列 
    *	非递归
    **/
    LNode ConcatenateOrderByData(LinkList A,LinkList B){
    	LinkList mergeList = NULL;
    	LNode *curLastNode = NULL;
    	LNode *p1=A;
    	LNode *p2=B;
    	if(A == NULL){
    		return B;
    	}
    	if(B == NULL){
    		return A;
    	}
    	if(A->data < B->data){
    		mergeList = A;
    	}else{
    		mergeList = B;
    	}
    	while(A != NULL && B != NULL){
    		if(A->data < B->data){
    		//先链入A结点
    			curLastNode->next = A;
    			curLast = A;
    			A = a->next;
    		}else{//先链入B结点
    			curLastNode->next = B;
    			curLast = B;
    			B = B->next;
    		}
    	}
    	//经过上面的while循环之后,如果A或B仍然不为空,说明有另外一方已经为空了
    	//直接将剩下的链表链入即可
    	if(A != NULL){
    		curLastNode->next = A;
    	}
    	if(B != NULL){
    		curLastNode->next = B;
    	}
    }
    void main(){
    
    }
    

      

  • 相关阅读:
    java中的位运算符
    Servlet中的初始化参数、上下文参数、以及@Resource资源注入
    Servlet中文件上传的几种方式
    marquee标签的使用
    SpringBoot热部署的两种方式
    eclipse中安装lombok插件
    关于Servlet中的转发和重定项
    Cormen — The Best Friend Of a Man CodeForces 732B
    牛客小白月赛9之签到题
    Codeforces アンバランス / Unbalanced
  • 原文地址:https://www.cnblogs.com/whutwxj/p/6564476.html
Copyright © 2011-2022 走看看