#include "stdio.h"
#include "stdlib.h"
typedef char ListItem;
struct alist {
int n; /* 表長,當表為空時,n=0 */
int maxsize; /* 表示線性表的最大長度 */
int length;
ListItem * data; /* 表元素陣列 */
};
typedef struct alist *List;
List ListInit (int size); /* 初始化函式 */
int ListEmpty(List L); /* 判斷線性表L是否為空 */
int ListLength(List L); /* 求表長 */
void ListInsert(int k, ListItem x, List L); /* 第k 個元素之后插入一個新元素x */
int ListLocate(ListItem x, List L); /* 回傳元素x在表中的位置 */
ListItem ListRetrieve(int k, List L); /* 獲取線性表中的第k個資料元素內容 */
void PrintList(List L); /* 輸出整個線性表 */
ListItem ListDelete(int k, List L); /* 將第k個元素洗掉 */
int main(int argc, char* argv[])
{
List L = ListInit(10);
ListInsert(0, 'a', L);
ListInsert(1, 'b', L);
ListInsert(2, 'c', L);
ListInsert(3, 'd', L);
ListInsert(4, 'e', L);
PrintList(L);
ListDelete(4, L);
PrintList(L);
int loc = ListLocate(3, L);
printf("元素 3 的位置: %c\n\n", loc);
if(ListEmpty(L))
{
printf("線性表L為空!\n\n");
}
else
{
printf("線性表L不空!\n\n");
}
int length = ListLength(L);
printf("線性表L表長:%d\n\n", length);
/* ======================================== */
/* 可以在下面進一步測驗您撰寫的函式的功能 */
/* ======================================== */
return 0;
}
/* 初始化函式 */
List ListInit (int size)
{
List L;
L = (List) malloc(sizeof(struct alist));
/* 請使用malloc函式或者new操作,為線性表分配初始空間*/
L->maxsize=size;
L->n=0; /*將當前線性表長度置0*/
return L; /*成功,回傳L*/
}
/* 判斷線性表L是否為空 */
int ListEmpty(List L)
{
/* 請撰寫代碼,實作函式功能 */
if (L->length == 0) { return 1; }
return 0;
}
/* 求表長 */
int ListLength(List L)
{
if (L == NULL) { return 0; } return L->length;
/* 請撰寫代碼,實作函式功能 */
}
/* 第k 個元素之后插入一個新元素x */
void ListInsert(int k, ListItem x, List L)
{
printf("在位置 %d 插入元素 %c\n\n", k, x);
int i;
if (k < 0 || k > L->n)
{
printf("out of bounds");
exit(0);
}
if (L->n == L->maxsize)
{
printf("out of memory");
exit(0);
}
else
{
for (k = i; k <= L->length; k--)
{
L->data[k + 1] = L->data[k];
}
L->data[i - 1] = x;
L->length++; //資料表的長度加1
} /* 請在此添加代碼,實作在第k個元素后插入值為x的新元素的功能 */
}
/* 回傳元素x在表中的位置 */
int ListLocate(ListItem x, List L)
{
/* 請在此添加代碼,實作函式功能 */
int k;
for (k = 0; k < L->length; k++)
{
if (L->data[k] == x)
{
//k為e對應的陣列下標,在表中對應序號應為k+1
return k + 1;
}
}
return 0;
}
/* 獲取線性表中的第k個資料元素內容 */
ListItem ListRetrieve(int k, List L)
{
/*判斷k值是否合理,若不合理,ERROR*/
if (k<1 || k>L->n)
{
printf("ERROR: out of bounds");
exit(0);
}
/* 請在此添加代碼,實作函式功能 */
if (L->length < 1 || (L->length > ListLength(L)))
{
return 0;
}
//資料元素的序號從1開始,陣列下表從0開始,第k個元素對應的陣列下標為k-1;
return L->data[k - 1];
}
/* 輸出整個線性表 */
void PrintList(List L)
{
/* 請撰寫代碼,實作函式功能 */
int k;
if (ListEmpty(L))
{
printf("表為空!\n");
return;
}
for (k = 0; k < L->length; k++)
{
printf("%-3d", L->data[k]);
}
printf("\n");
}
/* 將第k個元素洗掉 */
ListItem ListDelete(int k, List L)
{
int i; ListItem x;
if (k<1||k>L->n)
{
printf("ERROR: out of bounds");
exit(0);
}
printf("洗掉第 %d 個元素\n\n", k);
x=L->data[k-1];
x = L->data[i - 1];
for (k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
L->length--;
return x;
}
uj5u.com熱心網友回復:
你應該告訴我們你說的“錯”的現象是什么,是編譯錯誤還是運行達不到預期?不然我們很難幫你定位啊uj5u.com熱心網友回復:
老兄 你出問題都不帶debug的嗎?oid ListInsert(int k, ListItem x, List L)
{
printf("在位置 %d 插入元素 %c\n\n", k, x);
int i; //沒有初始化
if (k < 0 || k > L->n)
{
printf("out of bounds");
exit(0);
}
if (L->n == L->maxsize)
{
printf("out of memory");
exit(0);
}
else
{
for (k = i; k <= L->length; k--) //for回圈不會執行
{
L->data[k + 1] = L->data[k];
}
L->data[i - 1] = x; //陣列越界,core dump
uj5u.com熱心網友回復:
#include "stdio.h"
#include "stdlib.h"
typedef char ListItem;
struct alist {
//int n; /* 表長,當表為空時,n=0 */
int maxsize; /* 表示線性表的最大長度 */
int length;
ListItem * data; /* 表元素陣列 */
};
typedef struct alist *List;
List ListInit (int size); /* 初始化函式 */
int ListEmpty(List L); /* 判斷線性表L是否為空 */
int ListLength(List L); /* 求表長 */
void ListInsert(int k, ListItem x, List L); /* 第k 個元素之后插入一個新元素x */
int ListLocate(ListItem x, List L); /* 回傳元素x在表中的位置 */
ListItem ListRetrieve(int k, List L); /* 獲取線性表中的第k個資料元素內容 */
void PrintList(List L); /* 輸出整個線性表 */
ListItem ListDelete(int k, List L); /* 將第k個元素洗掉 */
int main(int argc, char* argv[])
{
List L = ListInit(10);
ListInsert(0, 'a', L);
ListInsert(1, 'b', L);
ListInsert(2, 'c', L);
ListInsert(3, 'd', L);
ListInsert(4, 'e', L);
PrintList(L);
ListDelete(4, L);
PrintList(L);
int loc = ListLocate(3, L);
printf("元素 3 的位置: %c\n\n", loc);
if(ListEmpty(L))
{
printf("線性表L為空!\n\n");
}
else
{
printf("線性表L不空!\n\n");
}
int length = ListLength(L);
printf("線性表L表長:%d\n\n", length);
/* ======================================== */
/* 可以在下面進一步測驗您撰寫的函式的功能 */
/* ======================================== */
return 0;
}
/* 初始化函式 */
List ListInit (int size)
{
List L;
L = (List) malloc(sizeof(struct alist));
/* 請使用malloc函式或者new操作,為線性表分配初始空間*/
L->maxsize=size;
//L->n=0; /*將當前線性表長度置0*/
L->length = 0;
//為data申請空間
L->data = (ListItem *)malloc(sizeof(ListItem) * size);
if (!L->data)
exit(0);
return L; /*成功,回傳L*/
}
/* 判斷線性表L是否為空 */
int ListEmpty(List L)
{
/* 請撰寫代碼,實作函式功能 */
if (L->length == 0) { return 1; }
return 0;
}
/* 求表長 */
int ListLength(List L)
{
if (L == NULL) { return 0; } return L->length;
/* 請撰寫代碼,實作函式功能 */
}
/* 第k 個元素之后插入一個新元素x */
void ListInsert(int k, ListItem x, List L)
{
printf("在位置 %d 插入元素 %c\n\n", k, x);
int i;
//if (k < 0 || k > L->n)
if (k < 0 || k > L->length)
{
printf("out of bounds");
exit(0);
}
if (L->length == L->maxsize)
{
printf("out of memory");
//exit(0);
return;
}
else
{
//for (k = i; k <= L->length; k--)
for (i = L->length; i > k; i--)
{
L->data[i + 1] = L->data[i];
}
//L->data[i - 1] = x;
L->data[k] = x;
L->length++; //資料表的長度加1
} /* 請在此添加代碼,實作在第k個元素后插入值為x的新元素的功能 */
}
/* 回傳元素x在表中的位置 */
int ListLocate(ListItem x, List L)
{
/* 請在此添加代碼,實作函式功能 */
int k;
for (k = 0; k < L->length; k++)
{
if (L->data[k] == x)
{
//k為e對應的陣列下標,在表中對應序號應為k+1
return k + 1;
}
}
return 0;
}
/* 獲取線性表中的第k個資料元素內容 */
ListItem ListRetrieve(int k, List L)
{
/*判斷k值是否合理,若不合理,ERROR*/
//if (k<1 || k>L->n)
if (k<1 || k>L->length)
{
printf("ERROR: out of bounds");
exit(0);
}
/* 請在此添加代碼,實作函式功能 */
if (L->length < 1 || (L->length > ListLength(L)))
{
return 0;
}
//資料元素的序號從1開始,陣列下表從0開始,第k個元素對應的陣列下標為k-1;
return L->data[k - 1];
}
/* 輸出整個線性表 */
void PrintList(List L)
{
/* 請撰寫代碼,實作函式功能 */
int k;
if (ListEmpty(L))
{
printf("表為空!\n");
return;
}
//for (k = 0; k < L->length; k++)
//for (k = 0; k < L->n; k++)
for (k = 0; k < L->length; k++)
{
printf("%-3d", L->data[k]);
}
printf("\n");
}
/* 將第k個元素洗掉 */
ListItem ListDelete(int k, List L)
{
int i; ListItem x;
//if (k<1||k>L->n)
if (k<1||k>L->length)
{
printf("ERROR: out of bounds");
exit(0);
}
printf("洗掉第 %d 個元素\n\n", k);
x=L->data[k-1];
x = L->data[i - 1];
for (k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
L->length--;
return x;
}
供參考~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74471.html
標籤:C語言
上一篇:我編的一個小程式怎么沒輸出?程式功能:要求寫三個函式,一個用來輸入10個整數,一個理這組數,一個輸出處理后的數。將最小的數和第一個數換,最大的和最后一個調換
下一篇:error C2109: subscript requires array or pointer type報錯 怎么辦 求大佬解決
