#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!='\n'){
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!='\n'){
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\n",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\n",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(){
}