您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】算法2.8-2.122 线性表的单链表

2016-10-10 19:23 351 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

/*******************************声明部分****************************************/

Status GetElem_L(LinkList L,int i,ElemType *e);
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR

void CreateList_L (LinkList *L,int n);
//逆位序输入n个元素的值,建立带头结点的单链线性表L
//(已改为自动生成)

Status ListTraverse_L(LinkList L);
//打印L中的元素

Status ListInsert_L(LinkList *L,int i,ElemType e);
//在带头结点的单链线性表L中第i个位置之前插入元素e

Status ListDelete_L(LinkList *L,int i,ElemType *e);
//在带投机诶单的单链线性表L中,删除第i个元素,并由e返回其值

void MergeList_L(LinkList *La,LinkList *Lb,LinkList *Lc);
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc也按值非递减排列

/*******************************函数部分****************************************/

Status GetElem_L(LinkList L,int i,ElemType *e)
{
LinkList p;
p = L->next;  //初始化,p指向第一个结点
int count = 1;
while(p && count < i){  //顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;
++count;
}
if(!p || count>i)
return ERROR;  //第i个元素不存在
*e = p->data;
return OK;
}

void CreateList_L (LinkList *L,int n)
{
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;  //建立一个带头结点的单链表
int count;
for(count = n;count>0;count--){
LinkList p;
p = (LinkList)malloc(sizeof(LNode)); //生成新结点
p->data = count;
p->next = (*L)->next;
(*L)->next = p; //插入到表头
} //for
}

Status ListTraverse_L(LinkList L)
{
LinkList p;
p = L->next;
printf("\nL中的元素有:");
while(p){
printf(" %d ",p->data);
p = p->next;
}
printf("\n");
return OK;
}

Status ListInsert_L(LinkList *L,int i,ElemType e)
{
LinkList p;
p = *L;
int count = 0;
while(p && count<i-1){
p = p->next;
++count;  //寻找第i-1个结点
}
if(!p || count>i-1)
return ERROR;
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;  //插入L中
return OK;
}

Status ListDelete_L(LinkList *L,int i,ElemType *e)
{
LinkList p;
p = *L;
int count = 0;
while(p->next && count<i-1){
p = p->next;
++count;  //寻找第i个结点
}
if(!p->next || count>i-1)
return ERROR;
LinkList s;
s = p->next;
p->next = s->next;
*e = s->data;
free(s);   //删除并释放结点
return OK;
}

void MergeList_L(LinkList *La,LinkList *Lb,LinkList *Lc)
{
LinkList pa,pb,pc;
pa = (*La)->next;
pb = (*Lb)->next;
*Lc = pc = *La;  //用La的头结点作为Lc的头结点
while(pa && pb){
if(pa->data <= pb->data){
pc->next = pa;
pc = pa;
pa = pa->next;
}
else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}//while
pc->next = pa?pa:pb;  //插入剩余段
free(*Lb);
}

/*******************************主函数部分**************************************/

int main()
{
LinkList L;
CreateList_L(&L,5);
ListTraverse_L(L);

ElemType e;
GetElem_L(L,2,&e);
printf("\nL中的第 2 个元素为 %d\n",e);

printf("\n\n下面在L的第4个元素前插入‘6’\n");
ListInsert_L(&L,4,6);
ListTraverse_L(L);

ElemType e1;
printf("\n\n下面将删除L中的第5个元素 \n");
ListDelete_L(&L,5,&e1);
ListTraverse_L(L);
printf("被删除的元素为 %d\n",e1);

printf("\n\n下面将La=123 ,Lb=1234567 合并到Lc中\n");
LinkList La,Lb,Lc;
CreateList_L(&La,3);
CreateList_L(&Lb,7);
MergeList_L(&La,&Lb,&Lc);
printf("下面将打印Lc中的元素\n");
ListTraverse_L(Lc);

return 0;
}


运行截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构