C语言数据结构-线性表的操作
线性表的类型定义:线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的
顺序表的定义
定义顺序表
typedef int datatype;
typedef struct {
int last;
Datatype date[maxsize];
}sequenlist;
1线性表的顺序表示和实现
1)顺序线性表的创建、打印和定位计数。
/*建立顺序表*/
void creatlist(sequenlist* L) {
int i, n;
int tmp;
printf("请输入数据个数:\n");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("date[%d]=", i);
scanf("%d", &tmp);
L->date[i] = tmp;
}
L->last = n - 1;
printf("\n");
}
/*打印顺序表*/
void printout(sequenlist* L) {
int i;
for (i = 0; i <= L->last; i++) {
printf("data[%d]=", i);
printf("%d\n", L->date[i]);
}
}
/*定位计数*/
int LocList(sequenlist* L,int i) {
if (L == NULL) {
printf("线性表为空");
return -1;
}
for (int j = 0; j <= L->last; j++) {
if (L->date[j] == i) {
printf("存在该数,该数在第%d个位置\n", j+1);
}
}
return 0;
}
2)顺序线性表插入/删除。(A)指定插入删除位置;(B)插入删除后数据保持有序。
/
/指定位置插入并保持有序
void insert(sequenlist* L,int x,int i)
{
? if (L == NULL && x > L->last) {
? printf("插入失败请重试");
? return;
? }
? int j;
? for (int j = L->last; j >= i; j--) {
? L->date[j + 1] = L->date[j];
? }
? L->date[i] = x;
? L->last++;
? //插入排序
? int temp;
? for (i = 1; i <= L->last; i++)
? {
? temp = L->date[i];
? j = i - 1;
? while (j >= 0 && temp < L->date[j]) //在这里改顺序 !!!
? {
? L->date[j+1] = L->date[j];
? j--;
? }
? L->date[j + 1] = temp;
? }
}
//指定位置删除并保持有序
void DeletList(sequenlist* L, int i) {
? if (L == NULL && i > L->last) {
? printf("删除失败请重试");
? return;
? }
? for (int j =i; j <=L->last; j++) {
? L->date[j ] = L->date[j+1];
? }
? L->last--;
? //插入排序
? int j;
? int temp;
? for (i = 1; i <= L->last; i++)
? {
? temp = L->date[i];
? j = i - 1;
? while (j >= 0 && temp < L->date[j]) //在这里改顺序 !!!
? {
? L->date[j + 1] = L->date[j];
? j--;
? }
? L->date[j + 1] = temp;
? }
}
3)顺序线性表就地逆序。
//顺序表就地逆序
void ReverList(sequenlist* L) {
? if (L == NULL) {
? return;
? }
? int left = 0;//左
? int right = L->last;//右
? while (left <= right) {
? //交换
? if (L->date[left] != L->date[right]) {
? L->date[left] = L->date[left] ^ L->date[right];
? L->date[right] = L->date[left] ^ L->date[right];
? L->date[left] = L->date[left] ^ L->date[right];
? }
? left++;
? right--;
? }
}
4)判断两顺序表是否相同
//判断两线性表是否相同
void JudgeSameList(sequenlist* L1, sequenlist* L2) {
? if ( L2 == NULL && L1 == NULL) {
? printf("线性表为空请重试");
? return;
? }
? else if (L1->last == L2->last) {
? int i = 0;
? while (i <= L1->last) {
? if (L1->date[i] != L2->date[i]) {
? printf("两线性表不相同");
? return;
? }
? i++;
? }
? printf("两线性表相同");
? return;
? }
? printf("两线性表不相同");
}
5}合并两个顺序表并对数据进行排序
void MergeList(sequenlist* L1, sequenlist* L2) {
? if (L1 == NULL&&L2!=NULL) {
? printf("合并失败");
? return ;
? }
? else if (L2 == NULL && L1 != NULL) {
? printf("合并失败");
? return ;
? }
? int j = 0;
? while (j <= L2->last) {
? L1->date[L1->last+++1] = L2->date[j++];
? }
?
? int temp;
? int i;
? for (i = 1; i <= L1->last; i++)
? {
? temp = L1->date[i];
? j = i - 1;
? while (j >= 0 && temp < L1->date[j])
? {
? L1->date[j + 1] = L1->date[j];
? j--;
? }
? L1->date[j + 1] = temp;
? }
}
写博客的第一天记录自己的学习(慢慢更新)
|