1. 定义单链表
#include "stdio.h"
#include "stdlib.h"
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
2. 创建一个空链表,返回指向链表的指针
linklist *creatList()
{ linklist *head;
head = initList(head);
return head;
}
3. 初始化单链表
linklist* initList(linklist *head)
{
head = (linklist*)malloc(sizeof(linklist));
head->next = NULL;
return head;
}
4. 尾插法创建单链表
linklist *creatList1()
{ datatype x; int n;
linklist *head,*rear,*p;
head = initList(head);
rear = head->next;
printf("please input length of list:");
scanf("%d",&n);
printf("please input X to be insert:");
while(n)
{
scanf("%d",&x);
p = (linklist)malloc(sizeof(linklist));
p->data=x;
rear->next=p;
rear = p;
n--;
}
rear->next=NULL;
return head;
}
5. 打印单链表
void displaylist(linklist *head)
{
linklist *p;
p = head->next;
printf("\n单链表head的各个元素分别是 : ");
while(p) {
printf("%d -> ",p->data);
p=p->next;
}
printf("\n");
}
6. 查找指定位置节点
void searchByIndex(linklist *head,int index)
{
linklist p* =head->next;
for(int i=0;i<index && p;i++)
p = p->next;
printf("%d",p->data);
}
7. 指定位置上插入结点
linklist* Insert(linklist *head,int i, datatype x)
{ linklist *p,*s;
int j;
p=head ;
j=0;
while (p && j<i-1)
{
p=p->next;
j++;
}
if (!p) printf("结点不存在!");
else {
s=(linklist*)malloc(sizeof(linklist)) ;
s->data=x;
s->next=p->next;
p->next=s;
}
return head;
}
8. 删除指定位置上的结点
linklist * Delete(linklist *head,int i)
{ linklist *p,*q;
int j;
p=head ; j=0;
while (p && j<i-1)
{
p=p->next;
j++;
}
if (!p||!p->next)
printf("结点不存在!");
else {
q=p->next;
p->next=q->next;
free(q);
}
return head;
}
9. 判断链表是否为空
int isEmpty(linklist *head)
{
if(head->next) return 0;
else return 1;
}
10. 按位置查找
linklist* locateItem(linklist *head,int Index)
{
linklist *p; int j;
if(Index<=0) {printf("您要找的元素不存在!");return head;}
p=head->next; j=1;
while (p && j<Index)
{
p=p->next;
j++;
}
if (!p) {printf("第i个元素不存在.\n");return NULL; }
else return p;
}
11. 删除单链表
void deleteList(linklist *head)
{
linklist *p,*q;
p=head;
while (p)
{
q=p;
p=p->next;
free( q);
}
head = NULL;
}
记忆小结
- 插入和删除都需要利用目标点的前一个节点,因此循环控制在j<i-1之前,因此循环控制条件还得保证p->next不为空(实际就是目标点不为空)
- 尾插法需要一个尾指针
- 删除单链表之后最后一步记得将head置空