单链表的结构及其操作

来源:互联网 发布:淘宝宝贝上架技巧 编辑:程序博客网 时间:2024/06/06 19:00

单链表的结构及其操作

/** * 作者:LinX  2017/6/3 -2017/6/9 * 内容:单链表及其操作  */ #include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,LinkList;/*单链表的基本操作*/ LNode* InitList();//初始化单链表LNode* getNode(LinkList *L,int pos); //返回pos位置上的节点 int isEmpty(LinkList *L); //判空void printList(LinkList *L); //打印 int getLength(LinkList *L); //得到单链表当前长度void createListH(LNode *head,int n); //用头插法建表void createListR(LNode *head,int n); //用尾插法建表void InsList(LinkList *L,int pos,ElemType e); //在pos后插入e ElemType DelList(LinkList *L,int pos); //删除某个位置的元素并返回该元素 void print(int n);/*单链表的非基本操作*/void reverse(LinkList *L,int start,int end);   //逆置start到end的单链表 void mergeUp(LinkList *L1,LinkList *L2,LinkList *L3);//将两个单链表(排好序)归并成一个  void mergeDown(LinkList *L1,LinkList *L2,LinkList *L3);//将两个单链表(排好序)归并成一个降序    int main(){LinkList *L1,*L2,*L3;L1=InitList();L2=InitList();L3=InitList();createListR(L1,3);createListR(L2,5);mergeDown(L1,L2,L3);printList(L3);return 0;}/*非基本操作*//*将两个单链表(排好序)归并成一个(降序)*/ void mergeDown(LinkList *L1,LinkList *L2,LinkList *L3){LNode *p,*q,*temp;p=L1->next;q=L2->next;while(p!=NULL&&q!=NULL){if(p->data<q->data){temp=p->next;p->next=L3->next;L3->next=p;p=temp;}else{temp=q->next;q->next=L3->next;L3->next=q;q=temp;}}while(p!=NULL){temp=p->next;p->next=L3->next;L3->next=p;p=temp;}while(q!=NULL){temp=q->next;q->next=L3->next;L3->next=q;q=temp;}}/*将两个单链表(排好序)归并成一个 (升序)*/ void mergeUp(LinkList *L1,LinkList *L2,LinkList *L3){LNode *p,*q,*r;p=L1->next;q=L2->next;r=L3;while(p!=NULL&&q!=NULL){if(p->data>q->data){r->next=q;r=q;q=q->next;}else{r->next=p;r=p;p=p->next;}}if(p!=NULL){r->next=p;}if(q!=NULL){r->next=q;}}/*逆置start到end之间的单链表*/ void reverse(LinkList *L,int start,int end){LNode *p,*q,*t;p=getNode(L,start-1);q=getNode(L,end);while(p->next!=q){t=p->next;p->next=t->next;//把t节点插入到q之后一位,类似于头插法 s->next=Head->next;Head->next=s; t->next=q->next;q->next=t;}}/*基本操作*//*得到pos位置上的节点*/LNode* getNode(LinkList *L,int pos){int i=0;LNode *p=L->next;if(pos==0){return L;}while(i<pos-1){p=p->next;i++;}return p;}/*删除指定位置的节点*/ ElemType DelList(LinkList *L,int pos){LNode *p,*q;int i=0;if(isEmpty(L)==1){printf("\n表为空\n");return;}if(pos>=getLength(L)||pos<0){printf("\n删除位置不对\n");return; }p=L->next;while(i<pos-1){p=p->next;i++;}q=p->next;p->next=q->next;free(q);} /*向指定位置的后面插入节点*/void InsList(LinkList *L,int pos,ElemType e){if(pos>=getLength(L)||pos<0){printf("\n插入位置错误\n");return;}int i=0;LNode *p,*s;p=L->next;s=(LNode *)malloc(sizeof(LNode));s->data=e;while(i<pos){p=p->next;i++;}s->next=p->next;p->next=s;}/*得到当前单链表的长度*/int getLength(LinkList *L){LNode *p;p=L->next;int len=0;while(p!=NULL){len++;p=p->next;}return len;} /*判空*/int isEmpty(LinkList *L){if(L->next==NULL){return 1;}return 0;}/*初始化链表,创建头节点*/LNode* InitList(){//创建头节点 LNode *head;head=(LNode *)malloc(sizeof(LNode));head->next=NULL;return head;}/*用头插法创建长度为n的单链表(数据跟输入的顺序相反)*/ void createListH(LNode *head,int n){int i,e;LNode *s;for(i=0;i<n;i++){scanf("%d",&e);s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=head->next;head->next=s;}} /*用尾插法创建长度为n的单链表*/void createListR(LNode *head,int n){int i,e;LNode *r,*s;r=head;for(i=0;i<n;i++){scanf("%d",&e);s=(LNode*)malloc(sizeof(LNode));s->data=e;r->next=s;r=r->next;}s->next=NULL;} /*打印单链表*/void printList(LinkList *L){LNode *p=L->next;if(isEmpty(L)==1){printf("\n表空\n");return;}while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");} void print(int n){printf("\n%d\n",n);}


原创粉丝点击