标签:链表归并算法 链表建立 链表两种插入方式 两个链表合并 单链表
//---单链表的单链式存储结构---- typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //1.初始化 int Initlist(LinkList L) { L=NULL; return OK; } //初始化(带头结点) int Initlist(LinkList L) { L=(LNode*)malloc(sizeof(Lnode));//为头结点分配内存空间 L->next=NULL; return OK; } //求长度 int length_L(LinkList L) { i=0; p=L->next;//把第一个数据赋给p while(p)//但p不为空的时候,那就一直计数 { i++; p=p->next; } return i; } //3.访问第I个元素 Status GetElem_L(LinkList L,int i,ElemType &e) //L为带头结点的单链表的头指针 { p=L->next;//p是链表的第一个元素 j=1; while(p&&j<i)//当p指针存在并且没有到底i个元素的时候 { p=p->next;//让p向前移动 j++;//让J也自加1,直到J=I } if(!p||j>i)//找到最后还没有找到是,返回ERROR return ERROR; e=p->data;//把找到的数值赋给e,然后返回。 return OK; } //4.在p所指节点之后插入某一元素 q=(LinkList)malloc(sizeof(LNode)) q->data=x;//数据域赋值 q->next=p->next;//(1)插入 p->next=q;//(2) //5.插入:在带头指针的单链表L中第I个位置之前插入元素e Status Listinsert_L(LinkList &L,int i,ElemType e) { p=L; j=0; while(p&&j<i-1)//知道移动到需要插入的前一个元素 { p=p->next; j++; } if(!p||j>i-1)//如果移动到结尾还没有达到第I个元素,那就返回ERROR return ERROR; s=(LinkList)malloc(sizeof(LNode));//为插入的元素分配内存空间 s->data=e; s->next=p->next;//(1)插入操作 p->next=s;//(2) return OK; } //6.删除:删除P所指元素的后继元素 //直接把前一节点的指针跳过一个节点,然后到下一个节点 Status ListDelete_L(LinkList &L,int i,ElemType &e) //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 { p=L; j=0; while(p->next&&j<i-1) {//寻找第i个节点,并令p指向其前驱 p=p->next; j++; } if(!(p->next)||j>i-1) return ERROR; p->next=p->next->next;//跳过删除的那个节点 e=q->data;//把删除的值赋给e free(q);//释放已删除节点的空间 return OK; } //7.建立:输入线性表元素,以单链表存储方式存储,即创建单链表 //方法一:从头到尾,即从第一个元素节点逐个创建各个元素节点。 //每次都是链到链表的最后。(从无到有的建立) //创建头结点 L.(LinkList)malloc(sizeof(LNode)); L->next=NULL; r=L;//指针r始终指向尾节点,然后向后移动 //读入一个元素,链入其中: p=(LinkList)malloc(sizeof(LNode));//为插入的新的节点开辟空间 scanf(&p->data);//读入数据 p->next=NULL;//尾节点的下一位为空 r->next=p;//指针r始终指向尾节点,然后移动 r=r->next; //方法二:从尾到头, //创建头结点 L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; //读入一个元素,链入其中 p=(LinkList)malloc(sizeof(LNode));//为新节点开辟内存空间 scanf(&p->data);//读入数据 p->next=L->next;//让头结点指针的地址赋给新节点的指针指向 L->next=p;//让头结点指针指向新插入的数值元素 //建立算法:(逆序) void CreateList_L(LinkList &L,int n) { L=(LinkList)malloc(sizeof(LNode));//为头节点分配内存空间 L->next=NULL; for(i=n;i>0;i--) { p=(LinkList)malloc(sizeof(LNode));//为新节点开辟内除空间 scanf(&p->data);//读入数据 p->next=L->next;//让插入的节点指针指向尾节点,然后把头节点指针破坏 L->next=p;//让头结点指针指向新节点 } } //单链表的归并算法 //已知单链表La和Lb的元素按值非递减排列 void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { pa=La->next;//两个链表La和Lb pb=Lb->next; Lc=pc=La;//让La的头结点指针最为起始点 while(pa&&pb)//当两个链表都非空的时候 { if(pa->data<=pb->data)//如果La->data<=pb->data,那么就让La插入 { pc->next=pa;//让La插入,并让链表La下一个元素与Lb比较 pc=pa;//让移动指针指向链表La pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } pc->next=pa?pa:pb;//到最后,如果LA有剩余就全部插入,否则就把LB插入 //等价于如下代码 //if(pa) //pc->next=a; //else pc->next=pb free(Lb);//由于Lc是以LA作为起始的,最后释放链表LB } }
标签:链表归并算法 链表建立 链表两种插入方式 两个链表合并 单链表
原文地址:http://blog.csdn.net/u012989536/article/details/43269251