网上没找到类似的,加上自己对C语言的指针这块理解很不到位,走了很多弯路,试代码感觉理解对了,就把自己的理解敲一下,如果不对希望能指正一下
#include
#include
typedef int ElemType;
typedef struct { // 线性表中共有length个元素,是data[0]——data[length-1]
int data[20];
int length;
}SqList;
int initList(SqList *L)
{
L->length = 0;
return 1;
}
int printList(SqList L)
{
if (L.length == 0)
{
printf("链表为空\n");
return 0;
}
int i;
for (i = 0; i < L.length; i++) {
printf("data[%d] = %d\n", i, L.data[i]);
}
printf("\n");
return 1;
}
int getlength(SqList L) {
return L.length;
}
int createList(SqList *L, int length) {
//srand(time(0));
int i;
/*
for (i = 0; i < length; i++) {
L->data[i] = rand() % 100;
L->length++;
}
*/
for (i = 0; i < length; i++) {
printf("请升序输入链表的第%d个值", i+1);
scanf_s("%d", &L->data[i]);
L->length++;
}
return 1;
}
int insertList(SqList *L, int pos, ElemType elem) {
int i;
/*
if (pos<1 || pos>L->length)
{
printf("插入的位置有误,无法插入数据\n");
return 0;
}
*/
for (i = L->length - 1; i >= pos - 1; i--)
{
L->data[i + 1] = L->data[i];
}
L->data[pos - 1] = elem;
L->length++;
return 1;
}
int getElem(SqList L, int pos, ElemType *e) {
if (pos<1 || pos>L.length)
{
printf("查找位置有错误,无法获取指定位置的数据\n");
return 0;
}
*e = L.data[pos - 1];
return 1;
}
int locateElem(SqList L, ElemType e) {
int i;
for (i = 0; i < L.length; i++)
{
//printf("在%d层循环...\n",i);
if (L.data[i] == e)
{
printf("在pos[%d]位置处,查找到了元素elem:%d\n", i + 1, e);
return 1;
}
}
return 0;
}
int deleteList(SqList *L, int pos, ElemType *elem) {
int i;
if (pos<1 || pos>L->length)
{
printf("删除的位置有误,无法从该位置删除数据\n");
return 0;
}
*elem = L->data[pos - 1];
for (i = pos; i < L->length; i++) {
L->data[i - 1] = L->data[i];
}
L->length--;
return 1;
}
int clearList(SqList L, SqList *pL) {
//printf("In clearList function: %d\n", &L);
//printf("In clearList function: %d\n", pL);
L.length = 0;
pL->length = 0;
return 1;
}
void Dsort(SqList la, SqList lb, SqList *lc) {
int i = la.length, j = lb.length, k = 0, ea = 0, eb = 0;
//createList(lc, 2);
while (i > 0 && j > 0) {
getElem(la, i, &ea);
getElem(lb, j, &eb);
if (ea < eb) {
++k;
insertList(lc, k, eb);
--j;
}
else if (ea > eb) {
++k;
insertList(lc, k, ea);
--i;
}
else {
--i;
}
}
while (i > 0) {
getElem(la, i--, &ea);
insertList(lc, ++k, ea);
}
while (j > 0) {
getElem(lb, j--, &eb);
insertList(lc, ++k, eb);
}
}
void main() {
SqList La, Lb, Lc;
initList(&La);
initList(&Lb);
initList(&Lc);
createList(&La, 5);
createList(&Lb, 6);
Dsort(La, Lb, &Lc);
printList(La);
printList(Lb);
printList(Lc);
system("pause");
}
上面是一段能运行的用线性表实现某功能的代码(具体不说避免关键字被搜索到),其中创建函数时lc参数前缀为*,lc的类型不同于main中的Lc,因为函数中lc为指针,该函数内将lc地址传给另一个函数时直接用名字不用加&,这与main中不同。
函数间传地址还有另一种用法,如void creat(SqList &l),使用可以直接 creat(l),其中 l类型:SqList l。