線性表
** **線性表也叫做順序表,是最基本、最簡單、也是最常用的一種數據結構。線性表中數據元素之間的關系是一對一的關系,即除了第一個和最后一個數據元素之外,其它數據元素都是首尾相接的。
它的有點是訪問方便、直接,但是不足是在插入、刪除時需要的內存空間因為不確定而往往比較大。
單鏈表
鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。所以每個結點都是一個結構體。這里需要注意的是,在定義結構體的時候,結構體里面的變量必須是能夠明確確定內存空間的。
#include <stdio.h>
#include <stdlib.h>
//定義結點的樣式
typedef struct node{
char *name;//變量保存的是地址
struct node *next;//指向下一個結點的指針
}Node;
void myFree(Node *pHead){
while (pHead != NULL) {
//保存下一個結點的地址
Node *pTemp = pHead->next;
//首先釋放name對應的內存空間
free(pHead->name);
//再釋放結點本身
free(pHead);
//pHead指向下一個
pHead = pTemp;
}
}
int main(int argc, const char * argv[]) {
Node *pHead = NULL;
Node *pTail = NULL;
for (int i = 0; i < 3; i++) {
int total = 0;//記錄當前保存字符的個數
//創建一個新的結點
Node *pTemp = (Node *)malloc(1 * sizeof(Node));
if (pTemp == NULL) {
myFree(pHead);
exit(EXIT_FAILURE);
}
//輸入數據
//為name分配一片內存空間
printf("請輸入名字:");
char character;
while (1) {
//獲取一個字符
character = getchar();
//判斷這個字符是不是'\n'
if (character == '\n'){
//輸入完畢了
break;
} else{
//保存
//判斷是不是第一次來分配內存空間
if (pTemp->name == NULL) {
//第一次 使用malloc
pTemp->name = (char *)malloc(1 * sizeof(char));
if (pTemp->name == NULL) {
exit(EXIT_FAILURE);
}
} else{
pTemp->name = (char *)realloc(pTemp->name, (total+1)*sizeof(char));
if (pTemp->name == NULL) {
exit(EXIT_FAILURE);
}
}
pTemp->name[total] = character;
total++;
}
}
//這個結點的next指針賦初值
pTemp->next = NULL;
//判斷是將這個結點+到head 還是tail
if (pHead == NULL) {
pHead = pTemp;
pTail = pTemp;
} else{
pTail->next = pTemp;
pTail = pTemp;
}
}
Node *pTemp = pHead;
while (pTemp != NULL) {
printf("%s\n", pTemp->name);
pTemp = pTemp->next;
}
printf("\n");
return 0;
}