建一个工程
1.建一个头文件status.c
#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int ElemType;
#endif
2.建立linkList.h文件
#ifndef LINKLIST_H
#define LINKLIST_H
#include "status.h"
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Linklist InitList();//创建空链表
Status ListInsert(LinkList L,int i,ElemType e);//插入
Status ListTraverse(LinkList L);//遍历
Status ListDelete(LinkList L,int i,ElemType e);//删除
int ListLength(LinkList L);//长度
void MergleList(LinkList La,LinkList Lb);//合并
int LocateElem(LinkList L,ElemType e);
Status ClearList(LinkList L);
#endif
3.
3.创建listLink.c文件
#include "linkList.h"
#include <stdio.h>
LinkList InitList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
Status ListInsert(LinkList L,int i,ElemType e)
{ //在带头节点的单链表中L,第i个位置之前数入元素
LinkList p,s;
int j;
p=L;j=0;
while(p&&j<i-1)
{
p=p->next;//寻找第i-1个节点
++j;
}
if(!p||j>i-1) return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList L,int i,ElemType e){
//在带头节点的单链线表中,删除第i个元素,并由e返回其值
int j;
LinkList p,q;
p=L;
j=0;
while(p->next&&j<i-1){
p=p->next; //寻找第i个节点,并令p指向其前趋
++j;
}
if(!(p->next)||j>j-1) return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
Status ListTraverse(LinkList L)
{
LinkList p=NULL:
p=L->next;
int k=0;
while(p){
printf("%4d",p->data);
p=p->next;
k++;
}
if(k==0)
{
printf("链表为空");
return ERROR;
}
return OK;
}
int ListLengh(LinkList L)
{
LinkList p;
p=L->next;
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
void MergleList(LinkList La,LinkList Lb){
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
pc=La;
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(Lb);
}
}
Status ClearList(LinkList L){
LinkList p,q;
p=L->next;
while(p){
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
//在线性表中查找值为e的数据元素的位置序号
int LocateElem(LinkList L,ElemType e){
LinkList p;
p=L->next;
int j=1;
while(p&&(p->data)!=e){
p=p->next;
j++;
}
if(p){
return j;
}else{
return 0;
}
}
4.创建main_linkList.c
#include "linkList.h"
#include <stdio.h>
void main(){
LinkList L,La;
L=InitList();//创建一个空链表
ListTraverse(L);//打印输出链表 (遍历)
//向链表插入元素
ListInsert(L,1,1);
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
printf("\n");
printf("链表L元素为:");
ListTraverse(L);
//链表元素的删除
ListDelete(L,3,3);
printf("\n");
printf("链表删除后L元素为:");
ListTraverse(L);
La=InitList();
ListInsert(La,1,6);
ListInsert(La,2,7);
ListInsert(La,3,8);
ListInsert(La,4,9);
printf("\n");
printf("链La元素为:");
ListTraverse(La);
//合并链表
MergleList(L,La);
printf("\n");
printf("链表合并后L元素为:");
ListTraverse(L);
//链表的长度
printf("\n");
printf("合并后L链表的长度为%d",ListLength(L));
//查询元素的位置
printf("\n");
printf("查询元素的位置%d",LocateElem(L,6));
printf("\n");
//清空La链表的元素
ClearList(La);
printf("\n");
printf("链La元素为:");
ListTraverse(La);
}