线性表
** **线性表也叫做顺序表,是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
它的有点是访问方便、直接,但是不足是在插入、删除时需要的内存空间因为不确定而往往比较大。
单链表
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。所以每个结点都是一个结构体。这里需要注意的是,在定义结构体的时候,结构体里面的变量必须是能够明确确定内存空间的。
#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;
}