C语言——关于用指针处理链表

指针

指针的定义: *类型名 指针变量名 如: int *p;
定义的同时进行初始化: int *p=&a;

引用指针变量: p = &a;//把a的地址赋给指针变量p
&取地址运算符、“ * ” 指针运算符,*p代表指针变量p指向的对象

指针对数组的引用

int a[5]={0,1,2,3,4};
int *p;
p = &a[0];    	//表示把a[0]的地址赋值给指针p
或者写 p = a;//表示把数组a首元素的地址 ,即a[0]

数组指针的运算

*(p++)与   *(++p)是不同的;
	①  *(p++)是先取 *p 的值,然后使 p 加1;
	②   * (++p) 是先使p加 1,再取 *p;
++(*p)表示p所指向的元数值加1,即相当于++a[0];
*减法同理*

函数指针

int max(int ,int );
int (*p)(int,int)  ;	//定义指针函数
p = max;    		//表示将max函数的入口地址赋给指针变量p

指针数组作main函数的形参

int main() 或  int main(void) 	//表示函数没有参数,调用main函数时不必给出实参
int main( int argc , char argv[] ) 	// argc 和 argv 就是main函数的形参
					//argc 参数个数; argv 参数向量

1.什么是链表
链表是动态地进行存储分配的一种结构。
作用是为了避免内存的浪费,它是根据需要开辟内存单元设定的。
2.单向链表
由 head 的 next 指向下个节点
头指针:head (整个链表都必须包含head)
结点 :必须包含两部分(1)用户需要用的实际数据 (2)下一个节点的地址
空指针(表尾):NULL

3.建立链表(利用结构体)

struct Student
{	int num;
	float score;
	struct Student *next; //next是指针变量,指向下一个结构体的地址
};

4.输出链表

void output(struct student *head)  // 定义一个链表输出的函数
{
    struct student *p;  // 定义结构体指针变量p1,用于结点的后移,以实现输出操作
    p = head;  // 将head赋给p1,以实现对该链表的操作
    if (p != NULL) // 建立一个while循环,结束条件是到达尾结点
    do
    {
        printf("%d\n%f\n", p1->num, p1->score);  // 输出结点中的数值部分
        p1 = p1->next;  // 将下一个结点的位置赋给p1
    }while(p != NULL);//当p不是空地址时循环
  
}

5.注意
malloc()分配内存后最后记得free() 释放内存

详情:https://blog.csdn.net/linwh8/article/details/49648601

猜你喜欢

转载自blog.csdn.net/accumla/article/details/88804390