- 老师布置的作业,浅写一下吧
- 其中删除重复元素运用了三种方法
- 2022.3.15 更新代码风格,删除判空判满操作
#include <stdio.h>
#include <stdlib.h>
typedef struct sqlist{
int max;
int length;
int* data;
} sqlist;
int sqlist_init(sqlist* list, int max, int num);
int sqlist_destory(sqlist* list);
int sqlist_insert(sqlist* list, int pos, int value);
int sqlist_delete(sqlist* list, int pos, int *outv);
void sqlist_print(sqlist* list);
int sqlist_search(sqlist* list, int value);
int sqlist_delrep(sqlist* list);
int sqlist_merge(sqlist* l1, sqlist* l2,sqlist* L);
int main(){
int choice;
sqlist list;
int max, num;
printf("输入表长:");
scanf("%d", &max);
printf("表内数据个数:");
scanf("%d", &num);
sqlist_init(&list, max, num);
sqlist_print(&list);
printf("\n");
while (1){
printf("1)插入数据\n");
printf("2)删除元素\n");
printf("3)查找元素\n");
printf("4)删除重复元素\n");
printf("5)合并顺序表\n");
printf("6)退出\n");
scanf("%d", &choice);
if (choice == 1){
int pos, value;
printf("插入位置及插入数据:");
scanf("%d%d", &pos, &value);
sqlist_insert(&list, pos, value);
sqlist_print(&list);
}
else if (choice == 2){
int pos_delete;
printf("删除数据的位置:");
scanf("%d", &pos_delete);
sqlist_delete(&list, pos_delete, &num);
sqlist_print(&list);
}
else if (choice == 3){
int value_search, i;
printf("待查找数据:");
scanf("%d", &value_search);
i = sqlist_search(&list, value_search);
if (i == 0)
printf("未找到该数据!\n");
else
printf("该数据位于%d位置\n", i);
}
else if (choice == 4){
sqlist_delrep(&list);
printf("\n");
sqlist_print(&list);
}
else if (choice == 5){
sqlist l1;
sqlist l2;
sqlist L;
sqlist_init(&l1, 10, 5);
sqlist_init(&l2, 10, 5);
sqlist_init(&L, 10, 0);
sqlist_merge(&l1, &l2, &L);
sqlist_print(&L);
sqlist_destory(&l1);
sqlist_destory(&l2);
sqlist_destory(&L);
}
else if (choice == 6)
break;
}
sqlist_destory(&list);
return 0;
}
int sqlist_init(sqlist* list, int max, int num){
list->max = max;
list->length = 0;
list->data = (int*)malloc(max * sizeof(int));
if (num > 0){
int i;
printf("数据:");
for (i = 0; i < num; i++){
scanf("%d", &list->data[i]);
list->length++;
}
}
return list->data != NULL;
}
int sqlist_destory(sqlist* list){
if (list->data == NULL)
return 0;
free(list->data);
list->data = NULL;
return 1;
}
int sqlist_insert(sqlist* list, int pos, int value){
pos -= 1;
if (pos < 0 || pos > list->length)
return 0;
if (list->length == list->max)
return -1;
int i;
for (i = list->length; i > pos; i--)
list->data[i] = list->data[i - 1];
list->data[pos] = value;
list->length++;
return 1;
}
int sqlist_delete(sqlist* list, int pos, int *outv){
if (pos < 0 || pos > list->length)
return 0;
if (list->length == 0)
return -1;
*outv = list->data[pos - 1];
int i;
for (i = pos; i < list->length; i++)
list->data[i - 1] = list->data[i];
list->length--;
return 1;
}
void sqlist_print(sqlist* list){
int i;
printf("当前顺序表为:");
for (i = 0; i < list->length; i++)
printf("%d ", list->data[i]);
printf("\n");
}
int sqlist_search(sqlist* list, int value){
int i;
for (i = 0; i < list->length; i++)
if (list->data[i] == value)
return i + 1;
return 0;
}
int sqlist_delrep(sqlist* list){
int j = 1, i = 0, len = 1;
while (j < list->length){
for (i = 0; i < len; ++i)
if (list->data[i] == list->data[j])
break;
if (i == len)
list->data[len++] = list->data[j++];
else
j++;
}
list->length = len;
return 0;
}
int sqlist_merge(sqlist* l1, sqlist* l2,sqlist* L){
int i = 0, j = 0;
while(i < l1->length && j < l2->length){
if (l1->data[i] <= l2->data[j]){
sqlist_insert(L, L->length +1, l1->data[i]);
i++;
}
else{
sqlist_insert(L, L->length +1, l2->data[j]);
j++;
}
}
while (i < l1->length){
sqlist_insert(L, L->length +1, l1->data[i]);
i++;
}
while (j < l2->length){
sqlist_insert(L, L->length +1, l2->data[j]);
j++;
}
}