c语⾔链表详解(超详细)
链表是⼀种常见的基础数据结构,结构体指针在这⾥得到了充分的利⽤。链表可以动态的进⾏存储分配,也就是说,链表是⼀个功能极为强⼤的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插⼊节点。链表都有⼀个头指针,⼀般以head来表⽰,存放的是⼀个地址。链表中的节点分为两类,头结点和⼀般节点,头结点是没有数据域的。链表中每个节点都分为两部分,⼀个数据域,⼀个是指针域。说到这⾥你应该就明⽩了,链表就如同车链⼦⼀样,head指向第⼀个元素:第⼀个元素⼜指向第⼆个元素;……,直到最后⼀个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放⼀个“NULL”(表⽰“空地址”),链表到此结束。
作为有强⼤功能的链表,对他的操作当然有许多,⽐如:链表的创建,修改,删除,插⼊,输出,排序,反序,清空链表的元素,求链表的长度等等。
初学链表,⼀般从单向链表开始
--->NULL
head
这是⼀个空链表。
---->[p1]---->[p2]...---->[pn]---->[NULL]
head  p1->next  p2->next  pn->next
有n个节点的链表。
创建链表
typedef struct student{
int score;
struct student *next;
} LinkList;
⼀般创建链表我们都⽤typedef  struct,因为这样定义结构体变量时,我们就可以直接可以⽤LinkList  *a;定义结构体类型变量了。
初始化⼀个链表,n为链表节点个数。
LinkList *creat(int n){
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head;        //若是空链表则头尾节点⼀样
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
修改链表节点值
修改链表节点值很简单。下⾯是⼀个传⼊链表和要修改的节点,来修改值的函数。
void change(LinkList *list,int n) {//n为第n个节点
LinkList *t = list;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
c语言listinsert函数}
if (t != NULL) {
puts("输⼊要修改的值");
scanf("%d", &t->score);
}
else {
puts("节点不存在");
}
}
删除链表节点
删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点。即:p->next = q->next;然后放出q节点的空间,即free(q);
void delet(LinkList *list, int n) {
LinkList *t = list, *in;
int i = 0;
while (i < n && t != NULL) {
in = t;
t = t->next;
i++;
}
if (t != NULL) {
in->next = t->next;
free(t);
}
else {
puts("节点不存在");
}
}
插⼊链表节点
我们可以看出来,插⼊节点就是⽤插⼊前节点的指针域链接上插⼊节点的数据域,再把插⼊节点的指
针域链接上插⼊后节点的数据域。根据图,插⼊节点也就是:e->next = head->next;  head->next = e;
增加链表节点⽤到了两个结构体指针和⼀个int数据。
void insert(LinkList *list, int n) {
LinkList *t = list, *in;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
in = (LinkList*)malloc(sizeof(LinkList));
puts("输⼊要插⼊的值");
scanf("%d", &in->score);
in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下⼀个节点
t->next = in;//填充t节点的指针域,把t的指针域重新指向in
}
else {
puts("节点不存在");
}
}
输出链表
输出链表很简单,边遍历边输出就⾏了。
while (h->next != NULL) {
h = h->next;
printf("%d  ", h->score);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。