【复习数据结构】单链表的操作

#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(){

}

  

原文地址:https://www.cnblogs.com/whutwxj/p/6564476.html