顺序表的增删查改,附加两个有序表的合并
----程序中容易出错的地方
·1.每次循环的边界条件。
·2.每次进行插入删除操作容易忘记对表标量值的修改。
----特别注意的地方:
·1.结构定义时用的数据域用的指针,这时内存大小可以用malloc或者realloc改变。
但是用数组时是不能进行修改的(不可修改的左值),涉及到数组和指针的区别
·2.!!!程序结束之前一定要free
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef int ElemType;
typedef struct {
ElemType * Array ;
int length;
}SeqList;
SeqList* init()
{
SeqList* list = (SeqList*)malloc(sizeof(SeqList));
if (list == NULL)
{
printf("malloc error\n");
}
list->Array = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));
list->length = 0;
return list;
}
/*---------------插入---------------------*/
void insert(SeqList* list,int i,ElemType val)
{
if (list != NULL&&list->Array != NULL)
{
if (i > 0 && i <= list->length+1) {
/*移动元素*/
for (int j = list->length - 1;j >= i-1;j--) {
list->Array[j + 1] = list->Array[j];
}
list->Array[i - 1] = val;
list->length++;
return;
}
printf("insert error\n");
}
printf("insert error\n");
}
void print(SeqList* list)
{
/*------------遍历顺序表-------------*/
if (list == NULL||list->length == 0) {
printf("表为空\n");
}
for (int i = 0;i < list->length;i++) {
printf("%4d", list->Array[i]);
}
printf("\n");
}
void freeList(SeqList* list)
{
if (list != NULL) {
if (list->Array != NULL) {
free(list->Array);
}
free(list);
}
}
/*-------------删除--------------*/
void deleteList(SeqList* list ,int i,ElemType* e)
{
if (list != NULL&&list->length > 0&&i>0&&i<=list->length){
*e = list->Array[i - 1];
for (int j = i - 1;j < list->length - 1;j++)
{
list->Array[j] = list->Array[j + 1];
}
--list->length;
return;
}
printf("delete error\n");
}
/*-----------------查找定位删除-------------*/
void locat_delete_list(SeqList* list, ElemType val)
{
if (list != NULL&&list->length > 0) {
for (int i = 0;i < list->length-1;i++)
{
if (val == list->Array[i]) {
for (int j = i;j < list->length - 1;j++)
{
list->Array[j] = list->Array[j + 1];
}
list->length--;
return;
/*如果要删除所有时
continue;
*/
}
}
}
}
/**************两个有序顺序表的合并*****************/
void MergeList(SeqList* La, SeqList* Lb, SeqList* Lc)
{
int* pa;int * pb;int* pc;
int* pa_last, pb_last;
pc = Lc->Array;
Lc->Array=(int *)realloc(pc,(La->length + Lb->length)*sizeof(int));/*重新分配空间*/
Lc->length = La->length + Lb->length;
pa = La->Array;
pb = Lb->Array;
pa_last = La->Array + La->length - 1;
pb_last = Lb->Array + Lb->length - 1;
while (pa < pa_last&&pb < pb_last)
{
if (*pa <*pb) {
*pc = *pa;
pa++;pc++;
}
else {
*pc = *pb;
pb++;pc++;
}
}
while (pa <= pa_last) {
*pc = *pa;
pa++;pc++;
}
while (pb <= pb_last) {
*pc = *pb;
pb++;pc++;
}
}
int main()
{
insert(list, 0, 1);
//insert(list, 1, 1);
//insert(list, 2, 2);
//insert(list, 3, 3);
//insert(list, 4, 4);
//print(list);
///*int e = 0;
//deleteList(list,2,&e);
//printf("%d is delete\n", e);
//print(list);*/
//locat_delete_list(list, 2);
//print(list);
SeqList* la = init();
SeqList* lb = init();
SeqList* lc = init();
for (int i = 0;i < 6;i++)
{
insert(la, i+1, i+3);
}
print(la);
for (int i = 0;i < 6;i++)
{
insert(lb, i + 1, i + 4);
}
print(lb);
MergeList(la, lb, lc);
print(lc);
freeList(la);
freeList(lb);
freeList(lc);
while (1);
return 0;
}