赞
踩
1.单链表的分类;
2.单链表的操作;
3.代码详解;
4.完整代码展示;
总体上来说,单链表可以分为两大类,一种是带头结点的,另一种是不带头结点的(由于带头结点的链表实用性更强,所以以下讲解和代码均为带头结点的链表);如果分细来讲,链表的插入可以分为两种:头插法和尾插法。
1.单链表的初始化;
2.单链表的头插法;
3.单链表的尾插法;
4.删除元素;
5.遍历链表;
1.首先应该列出需要用的头文件:
- #include<stdio.h>
- #include<stdlib.h> //可以用#include<malloc.h>代替
因为需要分配动态存储空间,所以要用到stdlib函数;
2.定义结构体;
- typedef struct Node
- {
- int data;
- struct Node *next;
- }node;
data为数据域,next为指针域。
3.初始化链表:
- node *listcreat()
- {
- node *list=(node *)malloc(sizeof(node));
- list->data=0; //头结点的数据域存储的是该链表中的结点的个数
- list->next=NULL;
- return list;
- }
建立一个返回值为node类型的指针函数,定义一个node类型的list指针并分配内存空间,
list的数据域为该链表的结点数,使头结点的next指向空,并返回该头结点的地址。
4头插法增加一个结点:
- void addlist(node *list,int data)
- {
- node *p=(node *)malloc(sizeof(node));
- p->data=data;
- p->next=list->next;
- list->next=p;
- list->data++;
- }
建立一个新的结点p,使p的next指向原来list的next指向的位置,并使list的next指向p,list的data加一。
5.尾插法增加一个结点:
- void tailadd(node *list,int data)
- {
- node *p=list->next;
- while(p->next!=NULL)
- {
- p=p->next;
- }
- node *q=(node *)malloc(sizeof(node));
- q->data=data;
- q->next=p->next;
- p->next=q;
- list->data++;
- }
先使p指向该链表的最后一个结点,增加一个结点,使p的next指向新的结点,list的data加一。
6.删除一个结点:
- void deletee(node *list,int n)
- {
- int flag=1;
- node *p=list,*q;
- while(p->next!=NULL)
- {
- q=p;
- p=p->next;
- if(n==p->data)
- {
- q->next=p->next;
- free(p);
- list->data--;
- flag=0;
- break;
- }
- }
- if(flag)
- printf("未找到该数据,请重新输入.\n");
- }
这一步的难点为while循环中的q指针和p指针的纠缠,总之,q一直指向p的上一个结点,这样就好理解了。
7.遍历链表:
- void print(node *list)
- {
- node *p=list;
- while(p!=NULL)
- {
- printf("%d->",p->data);
- p=p->next;
- }
- printf("NULL");
- }
遍历链表就是输出链表中的所有结点的数据,只需使p指向list然后while循环让p指向链表的下一个节点就OK了。注:输出的第一个数是list->data,也就是链表结点的个数。
8.main函数:
- int main()
- {
- node *list=listcreat();
- addlist(list,3);
- addlist(list,2);
- addlist(list,1);
- tailadd(list,4);
- tailadd(list,5);
- tailadd(list,6);
- deletee(list,4);
- print(list);
- return 0;
- }
main函数中对所有函数功能都检查一遍,确保没有错误。
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct Node
- {
- int data;
- struct Node *next;
- }node;
- node *listcreat()
- {
- node *list=(node *)malloc(sizeof(node));
- list->data=0; //头结点的数据域存储的是该链表中的结点的个数
- list->next=NULL;
- return list;
- }
- void addlist(node *list,int data)
- {
- node *p=(node *)malloc(sizeof(node));
- p->data=data;
- p->next=list->next;
- list->next=p;
- list->data++;
- }
- void tailadd(node *list,int data)
- {
- node *p=list->next;
- while(p->next!=NULL)
- {
- p=p->next;
- }
- node *q=(node *)malloc(sizeof(node));
- q->data=data;
- q->next=p->next;
- p->next=q;
- list->data++;
- }
- void deletee(node *list,int n)
- {
- int flag=1;
- node *p=list,*q;
- while(p->next!=NULL)
- {
- q=p;
- p=p->next;
- if(n==p->data)
- {
- q->next=p->next;
- free(p);
- list->data--;
- flag=0;
- break;
- }
- }
- if(flag)
- printf("未找到该数据,请重新输入.\n");
- }
- void print(node *list)
- {
- node *p=list;
- while(p!=NULL)
- {
- printf("%d->",p->data);
- p=p->next;
- }
- printf("NULL");
- }
- int main()
- {
- node *list=listcreat();
- addlist(list,3);
- addlist(list,2);
- addlist(list,1);
- tailadd(list,4);
- tailadd(list,5);
- tailadd(list,6);
- deletee(list,4);
- print(list);
- return 0;
- }
*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!
有帮助的话还请点个免费的赞和关注,后面还有数据结构其他部分的讲解,谢谢大家。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。