【复习数据结构】单链表的操作
#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(){ }