关于单链表
1.首先是结构体的定义
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
表示struct Node 和 Node是等价的。
int data,存储的数据类型。
声明了一个指向struct Node类型的next指针。
同时声明了指向Node结构体的一个LinkList指针。
struct Student
{
int name;
int num;
}s1,s2;
定义了一个Student数据类型的结构体,和s1,s2两个结构体变量。
2.关于指针
int *a = NULL;
int b = 3;
a = &b;
printf("%d", *a);
定义了一个指向NULL的指针,并将b的地址赋给a,输出a指向地址里存储的值。
所以:*a代表a指针指向地址存储的值,&b代表取b的地址。
3.初始化链表
Node* InitList()
{
LinkList head = (Node*)malloc(sizeof(Node));
if (head==NULL)
exit(-1);
head->next = NULL;
printf("创建成功\n");
return head;
}
定义了初始化函数,返回的是Node类型的头指针。
LinkList head为指向结构体Node的一个指针变量。malloc返回的是void类型,这里强制转换Node,或者LinkList head = (LinkList)malloc(sizeof(Node));
这一句,为指针动态分配内存,生成一个头结点。
将指针域指空,返回head头指针的地址。
//调用函数时,传参为地址。
4.创建,写入数据到链表
//void InsertList(LinkList *L, int *a)/*创建链表*///数组传入写法
void InsertList(LinkList *L)/*创建链表*//
{
LinkList p, q = NULL;int inputnum =0;
//*L为头结点
q = *L;
while(1)
{
puts("请输入数字,输入999停止");
scanf("%d", &inputnum);
if (inputnum==999)
break;
p = (LinkList)malloc(sizeof(Node));
p->data = inputnum;
q->next = p;
q = p;
}
q->next = NULL;//最后一个结点next设为空
}
参数LinkList L为指向结构体指针LinkList的指针L。调用函数时,L赋值为Init函数返回头指针的地址。
调用时Node *head = InitList();InsertList(&head);
,
指针L是struct Node的二级指针,head是struct Node的一级指针。L为struct Node*, head为sturct Node*, 为L赋值需要再取地址一次,所以参数为&head。
相当于Linklist *L = &head
,此时 L被赋值head的地址,L指向的是head的地址,*L就是head头结点了。
定义两个指向Node结构体的指针p,q。尾插法p->data,左边p指向结构体的指针进行->操作,循环实现尾插法。最后一个结点的指针域设为NULL。
5.遍历,输出链表
void showLinkList(LinkList *L)//展示链表
{
LinkList k= NULL;
k = (*L);
while (k->next!=NULL)
{
k = k->next;
printf("%d ", k->data);
}
}
Node结构体指针k指向头结点。
头结点无数据,所以检查下一个结点有无数据就可以,遍历输出。(*k).data
也可以输出。
7.删除指定结点
原理:找到指定结点的前驱结点,将前驱结点指向下下个结点,释放free指定节点,指向NULL。
void dele_appoint(LinkList *L, int num) //删除指定结点
{
LinkList current, q= NULL; int n=0;int flag=1;
current = (*L);//头结点
//current 为q的前驱结点
while((current->next)&&flag)
{
q = current->next;
if(q->data == num)
{
printf("要删除%d了", q->data);
current->next = q->next;
free(q);
q = NULL;
flag = 0;
}
else
{
current = current->next;
flag = 1;
}
}
if ((flag && current) == 1)
printf("找不到");
}
有错误请指正,感谢浏览o。
结束。今天看静态链表。