1 /*
2 程序功能:顺序表上基本运算的实现
3 1.顺序表L的初始化
4 2.创建一个顺序表L
5 3.求顺序表L的长度
6 4.按序号取顺序表L中的元素
7 5.在顺序表L中查找元素e的位置
8 6.在顺序表L中插入新元素
9 7.在顺序表L中删除元素
10 8.将线性表中元素输出
11 9.顺序表应用举例(求顺序表A和B的交集)
12 @润青
13 对于刚学数据结构的同学而言,可能有的同学理解能力比较强一点,加上前期C语言的基础,他们也许不会很长时间困惑于某一个知识点,但由于数据结构并非采用c语言进行讲述
14 ,而且大多数教材在讲述顺序表基本运算的实现这个知识点时只给出函数的代码,这就给一些同学造成了困惑,主函数的内容需要自己添加,理解难度提升,我认为不利于学习本节
15 内容,这也困扰了我很长时间,所以,在实现了之后,觉得有必要把内容写下来,希望能帮助到像我一样的初学者。
16
17 */
18 #include<stdio.h>
19 #include<stdlib.h>
20 #define MaxSize 100
21 #define LEN sizeof(SeqList)
22 typedef int DataType;
23 typedef struct{
24 DataType data[MaxSize];
25 int length;
26 }SeqList;
27 SeqList *L;
28 void InitList(SeqList *L)
29 {
30 L->length=0;
31 }
32 void CreatList(SeqList *L)
33 {
34 int k=0;
35 DataType x;
36 scanf("%d",&x);
37 while(x!=0)
38 {
39 L->data[k]=x;
40 k++;
41 scanf("%d",&x);
42 }
43 L->length=k;
44 }
45 int GetLength(SeqList *L)
46 {
47 return L->length;
48 }
49 DataType GetNode(SeqList *L,int i)
50 {
51 if(i<1||i>L->length)
52 {
53 printf("不存在该位置的元素!");
54 return 0;
55 }
56 return L->data[i-1];
57 }
58 int LocateList(SeqList *L,DataType e)
59 {
60 int i;
61 i=0;
62 while(i<L->length&&L->data[i]!=e)
63 i++;
64 if(i<L->length)
65 return i+1;
66 else
67 return -1;
68 }
69 void InsertList(SeqList *L,int i,DataType x)
70 {
71 if(i<1||i>L->length+1)
72 {
73 printf("插入位置只能介于1至n+1!");
74 return;
75 }
76 if(L->length==MaxSize)
77 {
78 printf("顺序表已满!");
79 return;
80 }
81 for(int j=L->length-1;j>=i-1;j--)
82 L->data[j+1]=L->data[j];
83 L->data[i-1]=x;
84 L->length++;
85 }
86 void DeleteList(SeqList *L,int i)
87 {
88 if(i<1||i>L->length)
89 {
90 printf("position error");
91 return;
92 }
93 for(int j=i;j<=L->length-1;j++)
94 L->data[j-1]=L->data[j];
95 L->length--;
96 }
97 void PrintList(SeqList *L)
98 {
99 int i;
100 printf("顺序表中元素为:\n");
101 for(i=0;i<L->length;i++)
102 printf("%d ",L->data[i]);
103 printf("\n");
104 }
105 void CommElem(SeqList *A,SeqList *B,SeqList *C)
106 {
107 int i,k,j=1;
108 DataType x;
109 InitList(C);
110 for(i=1;i<=GetLength(A);i++)
111 {
112 x=GetNode(A,i);
113 k=LocateList(B,x);
114 if(k>0)
115 {
116 InsertList(C,j,x);
117 j++;
118 }
119 }
120 }
121 int main()
122 {
123
124 int i,j,x;
125 L=(SeqList*)malloc(sizeof(SeqList));
126 InitList(L);
127 printf("创建一个链表,请输入链表中的元素(以0结束)\n");
128 CreatList(L);
129 GetLength(L);
130 printf("链表的长度为:%d\n",GetLength(L));
131 printf("请输入您要查询的结点i: ");
132 scanf("%d",&i);
133 GetNode(L,i);
134 printf("第%d个结点的元素为:%d\n",i,GetNode(L,i));
135 printf("请输入您要查询的元素:");
136 scanf("%d",&j);
137 LocateList(L,j);
138 printf("元素%d位于第%d个结点\n",j,LocateList(L,j));
139 printf("请输入您要插入的元素以及位置:");
140 scanf("%d%d",&x,&i);
141 InsertList(L,i,x);
142 PrintList(L);
143 printf("请输入您要删除的结点:");
144 scanf("%d",&i);
145 DeleteList(L,i);
146 PrintList(L);
147 /*顺序表应用举例
148 SeqList *A,*B,*C;
149 A=(SeqList*)malloc(sizeof(SeqList));
150 InitList(A);
151 printf("创建一个顺序表A,请输入顺序表A中的元素(以0结束)\n");
152 CreatList(A);
153 B=(SeqList*)malloc(sizeof(SeqList));
154 InitList(B);
155 printf("创建一个顺序表B,请输入顺序表B中的元素(以0结束)\n");
156 CreatList(B);
157 C=(SeqList*)malloc(sizeof(SeqList));
158 CommElem(A,B,C);
159 printf("A,B的交集为:\n");
160 PrintList(C);
161 */
162 return 0;
163 }