目录
一,单向链表
1)结点的设置
typedef struct node {
int data; //数据域
struct node *next; //指针域
//双向链表要添加 struct node *prior;
} Node, *Link;
malloc是一个返回类型为void*的函数 ,第一个括号是强制类型转换成p类型的指针,并且声明指向的内存类型;第二个括号是指向的内存有多大
p=(Link)malloc(sizeof(Node));
2) 创建一个单向链表
1.头插法(特点:与输入数据的顺序相反储存)
Link newList1(int a[], int n){//返回指针的函数
Link head;
head=(Link)malloc(sizeof(Node));
head->next=NULL;
for(int i=0;i<n;i++){
Link node;
node=(Link)malloc(sizeof(Node));
node->data=a[i];
node->next=head->next;
head->next=node;
}
return head;
}
2.尾插法(特点:与输入数据的顺序相同)
Link newList2(int a[], int n){
Link head,rear;
head=(Link)malloc(sizeof(Node));
head->next=NULL;
rear=head;
for(int i=0;i<n;i++){
Link node;
node=(Link)malloc(sizeof(Node));
node->data=a[i];
node->next=NULL;//防止忘加在最后一位
rear->next=node;
rear=node;
}
//node->next=NULL;
return head;
}
3)单链表结点的删除
思路:1.先判断是否为空表,若是空表提前返回false
2.工作指针p,q初始化,若q!=NULL,进入循环
3.若找到data==x;摘链,释放q指向内存,提前返回true
4.遍历没有找到x,返回false
bool deleteNode(Link head, int x){
Link p,q;
if(head==NULL;head->next==NULL)
return false;
p=head;
q=head->next;
while(q!=NULL){
if(q->data==x){
p->next=q->next;
free(q);//释放要删除的内存
return true
}
else{
p=q;
q=q->next;//没找到移动指针
}
}
return false;
}
4)单链表的释放(唯一移动头指针的类型)
思路:1.工作指针p初始化
2.如果head->next!=NULL,移动head
void clearLink(Link head){
Link p;
while(head->next!=NULL){//注意这里是next域
p=head;
head=head->next;
free(p);
}
}
二,循环链表 (能访问链表中某一结点前面的数据)
是将链表的最后一位的next域指向head,即将所有的node->next!=NULL换成node->next!=head
三, 双向链表
1)结点设置
typedef struct node {
int data; //数据域
struct node *next; //指针域1,向后找
struct node *prior;//指针域2,向前找
} Node, *Link;