结构体(抽象)和数组一样是聚合类型,进行整体初始化只有一次是在定义的时候
//自我理解结构体就是一种自己定义的数据类型
定义时建议使用typedef(类型重命名):
typedef struct Student
{
char name[20];
int age;
}Stu; //此时Stu是数据类型
结构体成员可以是变量,数组,指针,结构体。
结构体自应用只可以是指针的形式;
eg:
struct Node
{
int value;
struct Node *next;
}node1;
访问:
1.以 . 号的方式:变量.
eg:
node1.value = 10;
node1.next = Null;
2.以 -> 的方式:指针->
问题:class与struct区别??
单链表:不是连续的存储集合(逻辑上连续,物理上不连续)
数组:是连续的存储集合(逻辑上连续,物理上连续)
带头结点的单链表:
单链表的基本操作:
首先定义一个结构体:
typedef struct Node
{
int data;
struct Node* next;
}Node,*Plist;
- 初始化链表(如果你理解传值传址请忽略下面这段话)
说一下我在写这个函数遇到的问题,就是形参为什么用Plist plist,实参为什么用&head的问题;
其实答案很简单,传址后可以改变实参中的值,也就是将一个个结点串联起来
void InitList(Plist plist)
{
if(plist == NULL)
{
return;
}
plist->next = NULL;
}
- 给链表插入数据
首先要有得到一个节点的函数;
Node *GetNode(int val)
{
Node* p =(Node *)malloc(sizeof(Node));
if(p != NULL)
{
p->data = val;
p->next = NULL;
}
return p;
}
1.头插法
void InsertHead(Plist plist,int val)
{
Node * pcur = GetNode(val);
pcur -> next = plist->next;
plist->next = pcur;
}
2.尾插法
void InsertTail(Plist plist,int val)
{
Node *pcur = plist;
while(pcur->next != NULL)
{
pcur = pcur -> next;
}
Node *p = GetNode(val);
pcur->next = p;
}
- 输出链表的长度(不包含头节点)
int GetLen(Plist plist)
{
Node* pcur = plist->next;
int count = 0;
while(pcur != NULL)
{
count++;
pcur = pcur->next;
}
return count;
}
- 输出链表
void Show(Plist plist)
{
Node* pcur = plist->next;
while(pcur != NULL)
{
printf("%d ",pcur->data);
pcur = pcur->next;
}
}
C迷惑补充:
1.[]自带解引用
2…h文件用于函数的声明
3.c语言是一个弱类型语言;Java是强类型语言;