链表(linked list):链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
注:使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,链表允许插入和移除表上任意位置上的结点,但是不允许随机读取。链表类型:单向链表,双向链表以及循环链表。
#include "stdlib.h"
#include "stdio.h"
//定义链表结点
struct node{
int data;
struct node *next;
};
typedef struct node node;
/*
*create
*函数功能:创建链表
*输入:创建结点个数n
*返回值:链表头指针head
*/
node *create(int n){
node *head, *pf, *pb;//head链表头指针,pf为指向两相邻结点的前一结点的指针变量,pb为后一结点的指针变量
head = (node *)malloc(sizeof(node));
pf = head;
for (int i = 0; i<n; i++){
pb = (node *)malloc(sizeof(node));//在内存的动态存储区中分配一块长度为“sizeof(struct node)”字节的连续区域
printf("请输入一个数据\n");
scanf("%d", &(pb->data));
pf->next = pb;
pb->next = NULL;
pf = pb;
}
return head;
}
/*
*insert
*函数功能:在链表中插入元素
*输入:head链表头指针,p新元素位置,x新元素中的数据域内容
*返回值:viod
*/
void insert(node* head, int p, int x){
node* temp = head;
for (int i =0; i<p - 1; i++){
if (temp == NULL)//防止插入位置超出链表长度
return;
temp = temp->next;//取得p-1位置结点的指针,即插入位置前一个结点的指针
}
node* insert = (node*)malloc(sizeof(node));
insert->data = x;
insert->next = temp->next;
temp->next = insert;
}
/*
*del
*函数功能:删除链表中的结点
*输入:head链表头指针,p被删除结点位置
*返回值:被删除结点的数据域,如果失败返回-1
*/
int del(node *head, int p){
node *del = head, *temp;
for (int i =0; i<p - 1; i++){
if (del == NULL)
return -1;
del = del->next;
}
temp = del->next;
int ret = del->next->data;
del->next = temp->next;
free(temp);
return ret;
}
/*
*attach
*函数功能:连接两个链表
*输入:链表1的头指针head1;链表2的头指针head2
*返回值:返回连接后的头指针head1
*/
node * attach(node *head1,node *head2){
node *temp;
temp = head1;
while (temp->next != NULL)
temp = temp->next;
temp->next = head2->next;
return head1;
}
/*
*reverse
*函数功能:反序结点
*输入:链表头指针head
*返回:反序后链表的头指针head
*/
node * reverse(node *head){
node *temp, *p1, *p2;
p1 = NULL;
p2 = head;
while (p2){
temp = p2->next;
p2->next = p1;
p1 = p2;
p2 = temp;
}
node *h;
h = (node *)malloc(sizeof(node));
h->next = p1;
return h;
}
/*
*print
*函数功能:打印链表
*输入:链表的头指针head
*返回:void
*/
void print(node * head){
node *temp = head->next;
while (temp){
printf("%d\n", temp->data);
temp = temp->next;
}
}