<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status ;
typedef int ElementType ;
/*
链表实现的数据结构
此结构体有两项内容:1.存储值 2.指向下一结点的指针(类型为:LNode)
LNode 为此结构体的别名,
*LinkList 表示此结构体类型的指针,这样方面下边使用
*/
typedef struct LNode{
ElementType data ;
LNode * next ;
}LNode , *LinkList;
/*-------------创建链表,倒插入-----------------------*/
Status CreateList_ch(LinkList &L,int n){
int i ;
//建立带有头结点的单链表
L = (LinkList)malloc(sizeof(LNode)) ;
if(!L) exit(OVERFLOW) ;
L->next = NULL ; //先建立一个带有节点的单链表
for(i=n ;i>0;i--){
LinkList p=(LinkList) malloc(sizeof(LNode)); //生成新的节点
scanf("%d",&p->data) ; //输入元素的值
p->next= L->next ;
L->next = p ;
}
return OK;
}
/*---------向量表中插入数据------------------------*/
/*
完成功能:向链表的第i个位置插入e元素
*/
Status Insert_ch(LinkList &L,int i, ElementType e){
LinkList p =L->next ;
int j = 0;
while(p&&j<i-1){ //表示链表不为空且寻找到i-1位置处的指针
p = p->next ;
++j ;
}
if(!p||j>i-1) return ERROR ;//位置不合法
LinkList q = (LinkList)malloc(sizeof(LNode)); //创建一个新的节点
q->data = e ;
q->next = p->next ;
p->next = q ;
return OK ;
}
/*------------------删除链表中的指定位置的元素------------------------*/
//并且返回删除元素的值
Status Delete_ch(LinkList &L ,int i,ElementType &e){
LinkList p =L->next ;
int j = 0 ;
while(p&&j<i-1){ //寻找第i个结点,并指向要删除节点的前驱
p=p->next ;
++ j ;
}
if(!p||j>i-1) return ERROR ;//删除的位置不合法
LinkList d = p->next ;
e = d->data ;
p->next = p->next->next ;//或者使用p->next = d->next
free(d); //释放内存资源
return OK ;
}
/*---------获取某个位置上的值---------------------*/
Status GetElem(LinkList &L, int i, ElementType &e){
LinkList p = L->next ; //指向头结点的第一个元素
int j = 1 ;
while(p&&j<i){//当p不为空是,条件j=i时推出循环,p指向获取元素的位置
p=p->next ;
++j ;
}
if(!p||j>i) return ERROR ; //第i个元素不存在
e = p->data ;
return OK ;
}
/*--------------遍历链表--------------------------*/
Status PrintList(LinkList &L){
LinkList a = L->next ;
while(a!=NULL){
printf("%d\t" , a->data);
a=a->next ;
}
return OK ;
}
/*--------------两个有序链表的归并-----------------*/
Status MergeList_ch(LinkList La, LinkList Lb, LinkList &Lc){
//其中已知La,Lb都是有序的线性表
LinkList pa = La->next ;
LinkList pb = Lb->next ;
LinkList pc = NULL ;
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 ;
}
}
pc->next= pa?pa:pb ;//插入剩余的链表
free(pb);
return OK ;
}
void main(){
LinkList L ;
/*---------创建-----------*/
printf("输入五个数,用空格隔开:\n");
CreateList_ch(L,5);
PrintList(L);
/*---------插入-----------*/
printf("\n") ;
Insert_ch(L,3,5) ;
PrintList(L);
/*---------删除-----------*/
printf("\n") ;
int e ;
Delete_ch(L,3,e);
PrintList(L);
printf("\n") ;
printf("删除的元素为=%d\n",e);
/*---------获取i位置上的元素-----------*/
int d ;
GetElem(L,1,d);
printf("获取第一个元素的值为===%d\n",d);
/*-------------测试归并---------------*/
LinkList La ,Lb ,Lc;
CreateList_ch(La,3);
CreateList_ch(Lb,5);
MergeList_ch(La,Lb,Lc) ;
PrintList(Lc);
}
由于水平有限,有错误大家提出来,共同讨论,共同进步
<img src="https://img-blog.csdn.net/20140804163050704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamltb2xhbmdnZTEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />