数据结构之线性表

一:定义

  • 线性表(Linear List) :由同类型数据元素构成有序序列的线性结构
  • 表中元素个数称为线性表的长度
  • 线性表没有元素时,称为空表
  • 表起始位置称表头,表结束位置称表尾
  • 线性表的抽象数据类型描述
  • 类型名称:线性表(List)
  • 数据对象集:线性表是 n (≥0) 个元素构成的有序序列(a11​,a22​,…,ann​)
  • 操作集:线性表 L ∈ List,整数 i 表示位置,元素 X ∈ ElementType

1:线性表的顺序存储实现

注:顺序存储中是序号是下标,从 0 开始

last【当成数组位置】
0
1
2
i
1
2
3

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define ElementType int
 4 #define  MAXSIZE 10
 5 typedef struct Lnode *List;
 6 struct Lnode
 7 {
 8     ElementType Data[MAXSIZE];
 9     int last;
10 };
11 //建立空的顺序表
12 List MakeEmpty()
13 {
14     List PtrL;
15     PtrL = (List)malloc(sizeof(struct Lnode));
16     PtrL->last = -1;
17     return PtrL;
18 }
19 //查找
20 int Find(ElementType X,List PtrL)
21 {
22     int i = 0;
23     while(i<=PtrL->last && PtrL->Data[i]!=X)
24     {
25         i++;
26     }
27     if(i>PtrL->last)
28     {
29         return -1;
30     }
31     else
32     {
33         return i;
34     }
35 }
36 void Insert(ElementType X,int i,List Ptrl)
37 {
38     int j;
39     // 判断表满
40     if(Ptrl->last == MAXSIZE -1 )
41     {
42         printf("表满");
43         return;
44     }
45     //检查插入位置合法
46     if(i < 1 ||  i > Ptrl->last + 2)
47     {
48         printf("位置不合法");
49         return;
50     }
51     for(j = Ptrl->last;j>=i-1;j--)
52     {
53         Ptrl->Data[j + 1] = Ptrl->Data[j];
54     }
55     Ptrl->Data[i - 1] = X;
56     Ptrl->last++;
57     return;
58 }
59 void Delete(int i, List PtrL)
60 {
61     int j;
62     if (i < 1 || i > PtrL->last +1)
63     {
64         printf("不存在第%d个元素",i);
65         return;
66     }
67     for(j = i;j<=PtrL->last;j++)
68     {
69         PtrL->Data[j - 1] = PtrL->Data[j];
70     }
71     PtrL->last--;
72     return;
73 }
View Code
线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
插入、删除不需要移动数据元素,只需要修改“链”。
注:链式存储中是序号是下标,从 1 开始

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef struct LNode* List;
  4 struct LNode
  5 {
  6     List next;
  7     ElementType data;
  8 };
  9 List MakeEmpty()
 10 {
 11     List PtrL = (List)malloc(sizeof(struct LNode));
 12     PtrL = NULL;
 13     
 14     return PtrL;
 15 }
 16 
 17 //求表长
 18 int ListLength(List Ptrl)
 19 {
 20     List temp = Ptrl;
 21     int j = 0;
 22     while(temp)
 23     {
 24         temp = temp->next;
 25         j++;
 26     }
 27     return j;
 28 }
 29 //按序号查找
 30 List FindKth(int k,List Ptrl)
 31 {
 32     int i = 1;
 33     List temp = Ptrl;
 34     while(temp && i < k)
 35     {
 36         temp = temp->next;
 37         i++;
 38     }
 39     if (i == k)
 40     {
 41         return temp;
 42     }else
 43     {
 44         return NULL;
 45     }
 46 }
 47 //按值查找
 48 List Find(ElementType x,List Ptrl)
 49 {
 50     List temp = Ptrl;
 51     while(temp!=NULL && temp->data!=x)
 52     {
 53         temp = temp->next;
 54     }
 55     if (temp)
 56     {
 57         return temp;
 58     }
 59     else 
 60         return NULL;
 61 
 62 }
 63 List Insert(ElementType X,int i ,List Ptrl)
 64 {
 65     List p, s;
 66     if(i == 1)
 67     {
 68         s = (List)malloc(sizeof(struct LNode));
 69         s->data = X;
 70         s->next = Ptrl;
 71         return s;
 72     }
 73     p = FindKth(i - 1, Ptrl);
 74     if(p == NULL)
 75     {
 76         printf("参数%d有误",i);
 77         return NULL;
 78     }
 79     else
 80     {
 81         s = (List)malloc(sizeof(struct LNode));
 82         s->data = X;
 83         s->next = p->next;
 84         p->next = s;
 85         return Ptrl;
 86     }
 87 }
 88 List Delete(int i,List PtrL)
 89 {
 90     List p, s;
 91     if(i == 1)
 92     {
 93         s = PtrL;
 94         if(PtrL!=NULL)
 95         {
 96             PtrL = PtrL->next;
 97         }
 98         else
 99         {
100             return NULL;
101         }
102         free(s);
103         return PtrL;
104     }
105     p = FindKth(i - 1 ,PtrL);
106     if(p == NULL)
107     {
108         printf("第%d个节点不存在",i-1);
109     }
110     else if(p->next==NULL)
111     {
112         printf("第%d个节点不存在",i);
113     }
114     else
115     {
116         s = p->next;    //指向要删除的结点点
117         p->next = s->next; //从链表中删除
118         free(s); //释放删除的结点
119         return PtrL;
120     }
121 }
122 //Print
123 void Print(List Ptrl)
124 {
125     List temp = Ptrl;
126     while(temp)
127     {
128         printf("%d\n",temp->data);
129         temp = temp->next;
130     }
131 }
View Code

 

posted @ 2020-11-17 18:19  小姚yyy  阅读(146)  评论(0编辑  收藏  举报