1、单链表
由若干节点组成,单链表的结点只有一个指针域
单链表的结点结构
(1)结构体的创建
typedef struct node
{
int data;
struct node *next;
} Node,*Link;
头指针:指向第一个结点的地址
尾标志:终端结点的指针域为空
(2)遍历操作
void display(Link head)
{
Link p=head->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next; // 不能使用p++
}
}
注:p->next 指的是下一个结点的全部,包括下一节点的data和next
(3)求元素个数
伪代码
代码:
int length(Link head)
{
Link p = head->next;
int count = 0;
while (p != NULL)
{
p = p->next;
count++;
}
return count;
}
(4)查找元素
int search(Link head, int x)
{
Link p = head->next;
while (p != NULL)
{
if (p->data == x)
{
printf("%d", x);
return 1;
}
p = p->next;
}
return 0;
}
(5)插入操作
伪代码:
int insert(Link head,int i, int x)
{
Link p = head->next;
int count =0;
while (p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL)
return 0;
else{
Link node = (Link)malloc(sizeof(Link));
node->data = x;
node->next = p->next;
p->next = node;
return 1;
}
}
(6)创建单链表
①头插法
数组顺序和插入顺序是相反的
Link create(int a[], int n)
{
Link head = (Link)malloc(sizeof(Link));
head->next = NULL;
for (int i = 0; i < n; i++)
{
Link node = (Link)malloc(sizeof(Link));
node->data = a[i];
node->next = head->next;
head->next = node;
}
return head;
}
②尾插法
数组顺序和插入顺序相同
Link create(int a[], int n)
{
Link head = (Link)malloc(sizeof(Link));
head->next = NULL;
Link rear = head;
for (int i = 0; i < n; i++)
{
Link node = (Link)malloc(sizeof(Link));
node->data = a[i];
rear->next = node;
rear = node;
}
rear->next = NULL;
return head;
}
注:最后一个元素一定要设为空。(关键)
(7)删除结点
伪代码:
代码
int delete(Link head, int x)
{
if (head == NULL || head->next == NULL)
return 0;
Link p = head->next;
Link q = head;
while (p != NULL)
{
if (p->data == x)
{
q->next = p->next;
free(p);
return 1;
}
else
{
q = p;
p = p->next;
}
}
return 0;
}
2、循环链表
各项操作与单链表相同
3、双向链表
可以快速求得结点的前驱