数据结构与算法(二)线性表链式存储

  • 接口

 

#ifndef __LINEAR_LIST_H__ 
#define __LINEAR_LIST_H__ 
#include <stdlib.h> 
#include <stdio.h> 
#include<stdbool.h> 
typedef int ElementType; 
typedef struct LNode 
{ 
   ElementType Data; 
   struct LNode* Next; 
}LNode; 
typedef LNode* List;/* */ 


int Length(List L);// 
List FindKth(int K, List PtrL);// 
List Find(ElementType X, List PtrL); 
List Insert(ElementType X, int i, List PtrL);// 
List Delete(int i, List PtrL);// 
void Display(List PtrL); 
#endif

 

 

 

  • 函数实现

 

 

 

 

 

 

 

 

#include "LinearList.h" 
int Length(List L) 
{ 
   int length = 0; 
   while (L){ 
       L = L->Next; 
       length++; 
   } 
   return length; 
} 
List FindKth(int K, List PtrL) 
{ 
   List p = PtrL; 
   int i = 1; 
   while (p != NULL && i < K) {// 
       p = p->Next; 
       i++; 
   } 
   if (i == K) { 
       return p; 
   } 
   else { 
       return NULL; 
   } 
} 
List Find(ElementType X, List PtrL) 
{ 
   List p = PtrL; 
   while(p!=NULL && p->Data!=X){ 
       p = p->Next; 
   } 
   return p; 
} 
List Insert(ElementType X, int i, List PtrL) 
{ 
   List p, s; 
   if (i == 1) { // 
       s = (List)malloc(sizeof(struct LNode)); 
       s->Data = X; 
       s->Next = PtrL; 
       return s; 
   } 
   p = FindKth(i - 1,PtrL);// 
   if (p == NULL) { 
       printf("insert position error."); 
       return NULL; 
   } 
   else { 
       s = (List)malloc(sizeof(struct LNode)); 
       s->Data = X; 
       s->Next = p->Next; 
       p->Next = s; 
       return PtrL; 
   }   
} 
List Delete(int i, List PtrL) 
{ 
   List p, s; 
   if (i == 1) {// 
       s = PtrL; 
       if (PtrL != NULL) { 
           PtrL = PtrL->Next; 
       } 
       else { 
           return NULL; 
       } 
       free(s); 
       return PtrL; 
   } 
   p = FindKth(i - 1, PtrL);// 
   if (p == NULL) { 
       printf("delete pre position is error.\n"); 
       return NULL; 
   } 
   else if (p->Next == NULL) {// 
       printf("delete position is error.\n"); 
       return NULL; 
   } 
   else {//i 
       s = p->Next; 
       p->Next = s->Next; 
       free(s); 
       return PtrL; 
   } 
} 
void Display(List PtrL) 
{ 
   List p = PtrL; 
   while (p!=NULL)// 
   { 
       printf("%d ", p->Data); 
       p = p->Next; 
   } 
   printf("\n"); 
}

 

  • 测试函数

 

int main(int argc, char**argv) 
{ 
   List MyList = NULL; 
   for (int i = 0; i < 10; i++) 
   { 
       MyList = Insert(i, i+1, MyList); 
   } 
   Display(MyList); 
   printf("length is %d\n", Length(MyList)); 
   Delete(7, MyList); 
   Display(MyList); 
   printf("length is %d\n", Length(MyList)); 
   return 0; 
}

 

 

 

  • 测试结果

 

  • GitHub地址:

https://github.com/baiyu2017/baiyu2021.git

 

posted @ 2021-12-03 23:42  无忧小菜  阅读(53)  评论(0编辑  收藏  举报