单链表的结构及其操作
/**
* 作者: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);
}