佈局(LinearLayout,RelativeLayout,FrameLayout,TableLayout,GridLayout,ConstraintLayout)
阿新 • • 發佈:2021-06-30
1、定義一個結構體
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int ElemType; // 自定義連結串列的資料元素為整數。
typedef struct LNode
{
ElemType data; // 存放結點的資料元素。
struct LNode *next; // 指向下一個結點的指標。
}LNode,*LinkList;
int main()
{
return 0;
}
2、初始化連結串列
// 初始化連結串列LL,返回值:失敗返回NULL,成功返回頭結點的地址。 LNode *InitList1(); int main() { LinkList LL=NULL; // 宣告連結串列指標變數。 LL=InitList1(); // 初始化連結串列。 printf("LL=%p\n",LL); return 0; } // 初始化連結串列LL,返回值:失敗返回NULL,成功返回頭結點的地址。 LNode *InitList1() { LNode *head = (LNode *)malloc(sizeof(LNode)); // 分配頭結點。 if (head == NULL) return NULL; // 記憶體不足,返回失敗。 head->next=NULL; // 頭結點的下一結點暫時不存在,置空。 return head; }
三、建立一個數據元素。
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
return 0;
}
4、單鏈表的插入
// 在連結串列LL的第ii個位置插入元素ee,返回值:0-失敗;1-成功。 int InsertList(LinkList LL, unsigned int ii, ElemType *ee); int main() { LinkList LL=NULL; // 宣告連結串列指標變數。 LL=InitList1(); // 初始化連結串列。 printf("LL=%p\n",LL); ElemType ee; // 建立一個數據元素。 printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n"); ee=1; InsertList(LL, 1, &ee); ee=2; InsertList(LL, 1, &ee); ee=3; InsertList(LL, 1, &ee); ee=4; InsertList(LL, 1, &ee); ee=5; InsertList(LL, 1, &ee); ee=6; InsertList(LL, 1, &ee); ee=7; InsertList(LL, 1, &ee); ee=8; InsertList(LL, 1, &ee); ee=9; InsertList(LL, 1, &ee); ee=10; InsertList(LL, 1, &ee); printf("length=%d\n",LengthList(LL)); return 0; } // 在連結串列LL的第ii個位置插入元素ee,返回值:0-失敗;1-成功。 int InsertList(LinkList LL, unsigned int ii, ElemType *ee) { if ( (LL == NULL) || (ee == NULL) ) { printf("連結串列LL或元素ee不存在。\n"); return 0; } // 判斷表和元素是否存在。 // 判斷插入位置是否合法 if (ii < 1) { printf("插入位置(%d)不合法,應該在大於0。\n",ii); return 0; } // 要在位序ii插入結點,必須找到ii-1結點。 LNode *pp=LL; // 指標pp指向頭結點,逐步往後移動,如果為空,表示後面沒結點了。 int kk=0; // kk指向的是第幾個結點,從頭結點0開始,pp每向後移動一次,kk就加1。 while ( (pp != NULL) && (kk < ii-1) ) { pp=pp->next; kk++; printf("pp=%p,kk=%d\n",pp,kk); } if ( pp==NULL ) { printf("位置(%d)不合法,超過了表長。\n",ii); return 0; } LNode *tmp = (LNode *)malloc(sizeof(LNode)); // 分配一個結點。 if (tmp == NULL) return 0; // 記憶體不足,返回失敗。 // 考慮資料元素為結構體的情況,這裡採用了memcpy的方法而不是直接賦值。 memcpy(&tmp->data,ee,sizeof(ElemType)); // 處理next指標。 tmp->next=pp->next; pp->next=tmp; return 1; }
5、打印表中全部的元素
void PrintList(LinkList LL) int main() { LinkList LL=NULL; // 宣告連結串列指標變數。 LL=InitList1(); // 初始化連結串列。 printf("LL=%p\n",LL); ElemType ee; // 建立一個數據元素。 printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n"); ee=1; InsertList(LL, 1, &ee); ee=2; InsertList(LL, 1, &ee); ee=3; InsertList(LL, 1, &ee); ee=4; InsertList(LL, 1, &ee); ee=5; InsertList(LL, 1, &ee); ee=6; InsertList(LL, 1, &ee); ee=7; InsertList(LL, 1, &ee); ee=8; InsertList(LL, 1, &ee); ee=9; InsertList(LL, 1, &ee); ee=10; InsertList(LL, 1, &ee); PrintList(LL); return 0; } // 列印連結串列中全部的元素。 void PrintList(LinkList LL) { if (LL == NULL) { printf("連結串列LL不存在。\n"); return; } // 判斷連結串列是否存在。 LNode *pp=LL->next; // 從第1個結點開始。 while (pp != NULL) { printf("%-3d", pp->data); // 如果元素ee為結構體,這行程式碼要修改。 pp=pp->next; } printf("\n"); }
6、連結串列尾部插入元素
int PushBack(LinkList LL, ElemType *ee);
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee=1; InsertList(LL, 1, &ee);
ee=2; InsertList(LL, 1, &ee);
ee=3; InsertList(LL, 1, &ee);
ee=4; InsertList(LL, 1, &ee);
ee=5; InsertList(LL, 1, &ee);
ee=6; InsertList(LL, 1, &ee);
ee=7; InsertList(LL, 1, &ee);
ee=8; InsertList(LL, 1, &ee);
ee=9; InsertList(LL, 1, &ee);
ee=10; InsertList(LL, 1, &ee);
printf("在表尾插入元素11。\n");
ee=11; PushBack(LL, &ee);
PrintList(LL);
return 0;
}
// 在連結串列LL的尾部插入元素ee,返回值:0-失敗;1-成功。
int PushBack(LinkList LL, ElemType *ee)
{
if ( (LL == NULL) || (ee == NULL) ) { printf("連結串列LL或元素ee不存在。\n"); return 0; } // 判斷表和元素是否存在。
LNode *pp=LL; // 從頭結點開始。
// 找到最後一個結點。
while (pp->next != NULL) pp=pp->next;
LNode *tmp = (LNode *)malloc(sizeof(LNode)); // 分配一個結點。
if (tmp == NULL) return 0; // 記憶體不足,返回失敗。
// 考慮資料元素為結構體的情況,這裡採用了memcpy的方法而不是直接賦值。
memcpy(&tmp->data,ee,sizeof(ElemType));
// 處理next指標。
tmp->next=NULL;
pp->next=tmp;
return 1;
}
7、刪除某個節點
int DeleteNode(LinkList LL, unsigned int ii);
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee=1; InsertList(LL, 1, &ee);
ee=2; InsertList(LL, 1, &ee);
ee=3; InsertList(LL, 1, &ee);
ee=4; InsertList(LL, 1, &ee);
ee=5; InsertList(LL, 1, &ee);
ee=6; InsertList(LL, 1, &ee);
ee=7; InsertList(LL, 1, &ee);
ee=8; InsertList(LL, 1, &ee);
ee=9; InsertList(LL, 1, &ee);
ee=10; InsertList(LL, 1, &ee);
printf("在表尾插入元素11。\n");
ee=11; PushBack(LL, &ee);
PrintList(LL);
printf("刪除表中第7個結點。\n");
DeleteNode(LL,7); PrintList(LL);
return 0;
}
// 刪除連結串列LL中的第ii個結點,返回值:0-位置ii不合法;1-成功。
int DeleteNode(LinkList LL, unsigned int ii)
{
if (LL == NULL) { printf("連結串列LL不存在。\n"); return; } // 判斷連結串列是否存在。
// 判斷刪除位置是否合法
if (ii < 1) { printf("刪除位置(%d)不合法,應該在大於0。\n",ii); return 0; }
// 要刪除位序ii結點,必須找到ii-1結點。
LNode *pp=LL; // 指標pp指向頭結點,逐步往後移動,如果為空,表示後面沒結點了。
int kk=0; // kk指向的是第幾個結點,從頭結點0開始,pp每向後移動一次,kk就加1。
while ( (pp != NULL) && (kk < ii-1) )
{
pp=pp->next; kk++;
}
// 注意,以下行的程式碼與視訊中的不一樣,視訊中的是 if ( pp==NULL ),有bug。
if ( pp->next==NULL ) { printf("位置(%d)不合法,超過了表長。\n",ii); return 0; }
LNode *tmp=pp->next; // tmp為將要刪除的結點。
pp->next=pp->next->next; // 寫成p->next=tmp->next更簡潔。
free(tmp);
return 1;
}
8、刪除末尾的節點
int PopBack(LinkList LL)
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee=1; InsertList(LL, 1, &ee);
ee=2; InsertList(LL, 1, &ee);
ee=3; InsertList(LL, 1, &ee);
ee=4; InsertList(LL, 1, &ee);
ee=5; InsertList(LL, 1, &ee);
ee=6; InsertList(LL, 1, &ee);
ee=7; InsertList(LL, 1, &ee);
ee=8; InsertList(LL, 1, &ee);
ee=9; InsertList(LL, 1, &ee);
ee=10; InsertList(LL, 1, &ee);
printf("在表尾插入元素11。\n");
ee=11; PushBack(LL, &ee);
PrintList(LL);
printf("刪除表中第7個結點。\n");
DeleteNode(LL,7); PrintList(LL);
printf("刪除表中最後一個結點。\n");
PopBack(LL); PrintList(LL);
return 0;
}
// 刪除連結串列LL中最後一個結點,返回值:0-位置不合法;1-成功。
int PopBack(LinkList LL)
{
if ( LL == NULL ) { printf("連結串列LL不存在。\n"); return 0; } // 判斷表和元素是否存在。
// 必須加上這個判斷,否則下面的迴圈pp->next->next不成立。
if ( LL->next == NULL) { printf("連結串列LL為空,沒有尾結點。\n"); return 0; } // 判斷表是否為空。
// 要刪除最後一個結點,必須找到最後一個結點的前一個結點。
LNode *pp=LL; // 從第0個結點開始。
// 找到倒數第二個結點(包括頭結點)。
while (pp->next->next != NULL) pp=pp->next;
// 釋放最後一個結點。
free(pp->next);
pp->next=NULL;
return 1;
}
9、查詢某個節點的地址
LNode *LocateNode(LinkList LL, unsigned int ii);
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee=1; InsertList(LL, 1, &ee);
ee=2; InsertList(LL, 1, &ee);
ee=3; InsertList(LL, 1, &ee);
ee=4; InsertList(LL, 1, &ee);
ee=5; InsertList(LL, 1, &ee);
ee=6; InsertList(LL, 1, &ee);
ee=7; InsertList(LL, 1, &ee);
ee=8; InsertList(LL, 1, &ee);
ee=9; InsertList(LL, 1, &ee);
ee=10; InsertList(LL, 1, &ee);
printf("在表尾插入元素11。\n");
ee=11; PushBack(LL, &ee);
PrintList(LL);
printf("刪除表中第7個結點。\n");
DeleteNode(LL,7); PrintList(LL);
printf("刪除表中最後一個結點。\n");
PopBack(LL); PrintList(LL);
if ( (tmp=LocateNode(LL,3)) != NULL)
printf("第3個結點的地址是=%p,ee=%d\n",tmp,tmp->data);
return 0;
}
// 獲取連結串列中第ii個結點,成功返回結點的地址,失敗返回空。
// 注意,ii可以取值為0,表示頭結點。
LNode *LocateNode(LinkList LL, unsigned int ii)
{
if ( LL == NULL ) { printf("連結串列LL不存在。\n"); return NULL; } // 判斷表和元素是否存在。
LNode *pp=LL; // 指標pp指向頭結點,逐步往後移動,如果為空,表示後面沒結點了。
int kk=0; // kk指向的是第幾個結點,從頭結點0開始,pp每向後移動一次,kk就加1。
while ( (pp != NULL) && (kk < ii) )
{
pp=pp->next; kk++;
}
if ( pp==NULL ) { printf("位置(%d)不合法,超過了表長。\n",ii); return NULL; }
return pp;
}
10、查詢元素在連結串列LL上節點地址
LNode *LocateElem(LinkList LL, ElemType *ee);
int main()
{
LinkList LL=NULL; // 宣告連結串列指標變數。
LL=InitList1(); // 初始化連結串列。
printf("LL=%p\n",LL);
ElemType ee; // 建立一個數據元素。
printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
ee=1; InsertList(LL, 1, &ee);
ee=2; InsertList(LL, 1, &ee);
ee=3; InsertList(LL, 1, &ee);
ee=4; InsertList(LL, 1, &ee);
ee=5; InsertList(LL, 1, &ee);
ee=6; InsertList(LL, 1, &ee);
ee=7; InsertList(LL, 1, &ee);
ee=8; InsertList(LL, 1, &ee);
ee=9; InsertList(LL, 1, &ee);
ee=10; InsertList(LL, 1, &ee);
printf("在表尾插入元素11。\n");
ee=11; PushBack(LL, &ee);
PrintList(LL);
printf("刪除表中第7個結點。\n");
DeleteNode(LL,7); PrintList(LL);
printf("刪除表中最後一個結點。\n");
PopBack(LL); PrintList(LL);
if ( (tmp=LocateNode(LL,3)) != NULL)
printf("第3個結點的地址是=%p,ee=%d\n",tmp,tmp->data);
ee=8;
if ( (tmp=LocateElem(LL,&ee)) != NULL)
printf("元素值為8的結點的地址是=%p\n",tmp);
else
printf("元素值為8的結點的地址是NULL,沒找著。\n");
return 0;
}
// 查詢元素ee在連結串列LL中的結點地址,如果沒找到返回NULL,否則返回結點的地址。
LNode *LocateElem(LinkList LL, ElemType *ee)
{
LNode *pp=LL->next; // 從第1個數據結點開始。
while (pp != NULL)
{
// 如果資料元素是結構體,以下程式碼要修改。
if (pp->data == *ee) return pp;
pp = pp->next;
}
return NULL;
}