/*
* File: main.c
* Author: CJC
*
* Created on 2013年10月29日, 上午10:49
*/
#include
#include
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define LENGTH 10
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //链表结点,指向链表结点的指针
void CreateList_L(LinkList *Lk,int n) //构造长度为n的线性链表
{
LNode *L;
L=*Lk;
int i;
for (i=n;i>0;i--)
{
LNode *p;
p=(LNode*)malloc(sizeof(LNode));
p->data=rand()%50;
p->next=L->next;
L->next=p;
}
}
void Print_L(LNode *L) //打印链表(参数为链表头结点L)
{
while(L->next)
{
L=L->next;
printf("%d ",L->data);
}
printf("\n");
}
int GetLength(LNode *L) //求链表结点长度
{
int length=0;
while(L->next!=NULL)
{
L=L->next;
length++;
}
return length;
}
ElemType GetElemData(LNode *L,int n)//返回第n个结点的值
{
int i;
for (i=0;i
{
L=L->next;
}
return L->data;
}
int GetElem(LNode *L,ElemType e)
{
int i=0;
while(L->next!=NULL)
{
L=L->next;
i++;
if (L->data==e)
return i;
}
return ERROR;
}
Status ListInsert_L(LNode *L,int i,ElemType e)
{
/*
if (iGetLength(L)+1)
{
return ERROR;
}
while(i>1)
{
L=L->next;
i--;
}
*/
int j=1;
while (L&&j
{
L=L->next; ++j;
}
if (!L||j>i) return ERROR;
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
return OK;
}
Status ListDelete_L(LNode *L,int i,ElemType *e)
{
if (iGetLength(L))
{
return ERROR;
}
while(i>1)
{
L=L->next;
i--;
}
LNode *q;
q=L->next;
L->next=q->next;
*e=q->data;
free(q);
return OK;
}
Status Sort_LinkList(LNode *L) //将线性表排序。由小到大
{
if(L->next==NULL) return ERROR;
LNode *p =L->next;
int i;
ElemType t;
for (i=0;i
{
while(p->next)
{
if (p->data > (p->next->data))
{
t=p->data;//交换值就可以了
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
}
p=L->next;
}
return OK;
}
void MergeList_L(LNode *La,LNode *Lb,LinkList *Lc) //将有序表La,Lb合并到Lc中。去除不同元素且按有序排列。
{
LNode *pa=La->next;
LNode *pb=Lb->next;
LNode *pc=*Lc;
/*
while(pa&&pb) //方法一。这样做就改变了La,Lb。(因为改变的是Lc中next的指针,直接指向了La或者Lb的结点)
{
if (pa->data data)
{
pc->next=pa;pc=pa;pa=pa->next;
}
else
{
pc->next=pb;pc=pb;pb=pb->next;
}
pc->next=pa?pa:pb;
}
*/
while(pa&&pb) //方法二,通过新生成结点,插入到lc中的尾部,就可以不改变原La,Lc
{
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
if (pa->data data)
{
s->data=pa->data;
pc->next=s;
pc=s;
pa=pa->next;
}
else
{
s->data=pb->data;
pc->next=s;
pc=s;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
}
int main(int argc, char** argv) {
void CreateList_L(LinkList *L,int n);//函数声明
int GetLength(LNode *L);
ElemType GetElemData(LNode *L,int n);
Status ListInsert_L(LNode *L,int i,ElemType e);
Status Sort_LinkList(LNode *L);
Status ListDelete_L(LNode *L,int i,ElemType *e);
void MergeList_L(LNode *La,LNode *Lb,LinkList *Lc);
LNode *L; //定义头结点
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
printf("-----------------create AND print\n");
CreateList_L(&L,LENGTH);//此处传的参数为头结点的地址
Print_L(L);
printf("-----------------get length\n");
printf("%d",GetLength(L));
printf("\n-----------------return 5 Node\n");
printf("%d",GetElemData(L,5));
printf("\n-----------------return value=29\n");
printf("%d",GetElem(L,29));
printf("\n-----------------insert\n");
if(ListInsert_L(L,3,100)!=-1)
Print_L(L);
else
printf("ERROR\n");
printf("-----------------delete\n");
ElemType e;
if(ListDelete_L(L,3,&e)!=-1)
{
Print_L(L);
printf("e=%d",e);
}
else
printf("ERROR\n");
printf("\n-----------------sort\n");
Sort_LinkList(L);
Print_L(L);
printf("\n-----------------Merge La,Lb TO Lc\n");
LNode *La; //定义头结点
La=(LNode*)malloc(sizeof(LNode));
La->next=NULL;
LNode *Lb; //定义头结点
Lb=(LNode*)malloc(sizeof(LNode));
Lb->next=NULL;
LNode *Lc; //定义头结点
Lc=(LNode*)malloc(sizeof(LNode));
Lc->next=NULL;
CreateList_L(&La,LENGTH);//此处传的参数为头结点的地址
CreateList_L(&Lb,LENGTH);//此处传的参数为头结点的地址
Sort_LinkList(La);
Sort_LinkList(Lb);
Print_L(La);
Print_L(Lb);
MergeList_L(La,Lb,&Lc);
Print_L(Lc);
return (EXIT_SUCCESS);
}
/*
* File: main.c
* Author: CJC
*
* Created on 2013年10月29日, 上午10:49
*/
#include
#include
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define LENGTH 10
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //链表结点,指向链表结点的指针
void CreateList_L(LinkList *Lk,int n) //构造长度为n的线性链表
{
LNode *L;
L=*Lk;
int i;
for (i=n;i>0;i--)
{
LNode *p;
p=(LNode*)malloc(sizeof(LNode));
p->data=rand()%50;
p->next=L->next;
L->next=p;
}
}
void Print_L(LNode *L) //打印链表(参数为链表头结点L)
{
while(L->next)
{
L=L->next;
printf("%d ",L->data);
}
printf("\n");
}
int GetLength(LNode *L) //求链表结点长度
{
int length=0;
while(L->next!=NULL)
{
L=L->next;
length++;
}
return length;
}
ElemType GetElemData(LNode *L,int n)//返回第n个结点的值
{
int i;
for (i=0;i
{
L=L->next;
}
return L->data;
}
int GetElem(LNode *L,ElemType e)
{
int i=0;
while(L->next!=NULL)
{
L=L->next;
i++;
if (L->data==e)
return i;
}
return ERROR;
}
Status ListInsert_L(LNode *L,int i,ElemType e)
{
/*
if (iGetLength(L)+1)
{
return ERROR;
}
while(i>1)
{
L=L->next;
i--;
}
*/
int j=1;
while (L&&j
{
L=L->next; ++j;
}
if (!L||j>i) return ERROR;
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
return OK;
}
Status ListDelete_L(LNode *L,int i,ElemType *e)
{
if (iGetLength(L))
{
return ERROR;
}
while(i>1)
{
L=L->next;
i--;
}
LNode *q;
q=L->next;
L->next=q->next;
*e=q->data;
free(q);
return OK;
}
Status Sort_LinkList(LNode *L) //将线性表排序。由小到大
{
if(L->next==NULL) return ERROR;
LNode *p =L->next;
int i;
ElemType t;
for (i=0;i
{
while(p->next)
{
if (p->data > (p->next->data))
{
t=p->data;//交换值就可以了
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
}
p=L->next;
}
return OK;
}
void MergeList_L(LNode *La,LNode *Lb,LinkList *Lc) //将有序表La,Lb合并到Lc中。去除不同元素且按有序排列。
{
LNode *pa=La->next;
LNode *pb=Lb->next;
LNode *pc=*Lc;
/*
while(pa&&pb) //方法一。这样做就改变了La,Lb。(因为改变的是Lc中next的指针,直接指向了La或者Lb的结点)
{
if (pa->data data)
{
pc->next=pa;pc=pa;pa=pa->next;
}
else
{
pc->next=pb;pc=pb;pb=pb->next;
}
pc->next=pa?pa:pb;
}
*/
while(pa&&pb) //方法二,通过新生成结点,插入到lc中的尾部,就可以不改变原La,Lc
{
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
if (pa->data data)
{
s->data=pa->data;
pc->next=s;
pc=s;
pa=pa->next;
}
else
{
s->data=pb->data;
pc->next=s;
pc=s;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
}
int main(int argc, char** argv) {
void CreateList_L(LinkList *L,int n);//函数声明
int GetLength(LNode *L);
ElemType GetElemData(LNode *L,int n);
Status ListInsert_L(LNode *L,int i,ElemType e);
Status Sort_LinkList(LNode *L);
Status ListDelete_L(LNode *L,int i,ElemType *e);
void MergeList_L(LNode *La,LNode *Lb,LinkList *Lc);
LNode *L; //定义头结点
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
printf("-----------------create AND print\n");
CreateList_L(&L,LENGTH);//此处传的参数为头结点的地址
Print_L(L);
printf("-----------------get length\n");
printf("%d",GetLength(L));
printf("\n-----------------return 5 Node\n");
printf("%d",GetElemData(L,5));
printf("\n-----------------return value=29\n");
printf("%d",GetElem(L,29));
printf("\n-----------------insert\n");
if(ListInsert_L(L,3,100)!=-1)
Print_L(L);
else
printf("ERROR\n");
printf("-----------------delete\n");
ElemType e;
if(ListDelete_L(L,3,&e)!=-1)
{
Print_L(L);
printf("e=%d",e);
}
else
printf("ERROR\n");
printf("\n-----------------sort\n");
Sort_LinkList(L);
Print_L(L);
printf("\n-----------------Merge La,Lb TO Lc\n");
LNode *La; //定义头结点
La=(LNode*)malloc(sizeof(LNode));
La->next=NULL;
LNode *Lb; //定义头结点
Lb=(LNode*)malloc(sizeof(LNode));
Lb->next=NULL;
LNode *Lc; //定义头结点
Lc=(LNode*)malloc(sizeof(LNode));
Lc->next=NULL;
CreateList_L(&La,LENGTH);//此处传的参数为头结点的地址
CreateList_L(&Lb,LENGTH);//此处传的参数为头结点的地址
Sort_LinkList(La);
Sort_LinkList(Lb);
Print_L(La);
Print_L(Lb);
MergeList_L(La,Lb,&Lc);
Print_L(Lc);
return (EXIT_SUCCESS);
}