线性表的链式表示和实现

建一个工程
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);
    
   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值