提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
概念
单链表:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
1.头文件
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
typedef struct Node
{
int data; //数据域
struct Node *next; //指针域
} node;
typedef struct LinkList
{
node * head; //虚拟头结点
node * tail; //尾结点
int size; //链表的大小
} link_list;
//新建数据节点
node * GetNewNode(int val);
//初始化一个空的链表
link_list * InitLinkList();
//向链表中插入数据(尾插法)
int LinkListPushBack(link_list * list, int x);
//向链表中插入数据(头插法)
int LinkListPushFront(link_list * list, int x);
//从链表中删除数据(尾删法)
int LinkListPopBack(link_list * list);
//从链表中删除数据(头删法)
int LinkListPopFront(link_list * list);
//删除指定值的结点(第一个出现)
int RemoveLinkListNode(link_list * list, int x);
//查找链表中的数据
int LinkListFind(link_list * list, int x);
//打印链表
void PrintLinkList(link_list * list);
//删除链表
void DeleteLinkList(link_list * list);
2.源文件
代码如下(示例):
#include "link_list.h"
//新建数据节点
node *GetNewNode(int val)
{
node *newNode = (node *)malloc(sizeof(node));
newNode->data = val;
newNode->next = NULL;
return newNode;
}
//初始化空的链表
link_list *InitLinkList()
{
link_list *list = (link_list *)malloc(sizeof(link_list));
list->head = list->tail = GetNewNode(0); //初始化头尾是同一个结点
list->head->next = NULL;
list->size = 0;
return list;
}
//向链表中插入数据(尾插法)
int LinkListPushBack(link_list *list, int x)
{
assert(list != NULL);
node *newNode = GetNewNode(x);
list->tail->next = newNode; //将新结点连接到尾结点的下一个结点
list->tail = newNode; //将尾结点指向新结点
list->size++;
return 0;
}
//向链表中插入数据(头插法)
int LinkListPushFront(link_list *list, int x)
{
assert(list != NULL);
node *newNode = GetNewNode(x);
newNode->next = list->head->next; //将新结点连接到虚拟头结点的下一个结点
list->head->next = newNode; //将尾结点指向新结点
if (list->size == 0)
{
list->tail = newNode;
}
list->size++;
return 0;
}
//从链表中删除数据(尾删法)
int LinkListPopBack(link_list *list)
{
assert(list != NULL);
if (list->size == 0)
{
printf("链表为空,无法删除\n");
return -1;
}
node *p = list->head;
while (p->next != list->tail)
{
p = p->next;
}
free(list->tail);
list->tail = p;
list->tail->next = NULL;
list->size--;
return 0;
}
//从链表中删除数据(头删法)
int LinkListPopFront(link_list *list)
{
assert(list != NULL);
if (list->size == 0)
{
printf("链表为空,无法删除\n");
return -1;
}
node *temp = list->head->next;
list->head->next = temp->next;
free(temp);
if (list->size == 1)
{
list->tail = list->head;
}
list->size--;
return 0;
}
//删除指定值的结点(第一个出现)
int RemoveLinkListNode(link_list * list, int x)
{
assert(list != NULL);
if(list->size == 0){
printf("链表为空,无法删除\n");
return -1;
}
node * p = list->head->next;
node * q = list->head;
while (p->data != x)
{
q = p;
p = q->next;
if(p == NULL){
printf("没有找到指定值的结点\n");
return -1;
}
}
q->next = p->next;
list->size--;
return 0;
}
//查找链表的数据
int LinkListFind(link_list *list, int x)
{
assert(list != NULL);
node *p = list->head->next;
while (p != NULL && p->data != x)
{
p = p->next;
}
return p != NULL ? p->data : -1;
}
//打印链表
void PrintLinkList(link_list *list)
{
assert(list != NULL);
printf("----------size: %d------------\n", list->size);
node *temp = list->head->next;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n---------------------------\n");
}
//删除链表
void DeleteLinkList(link_list *list)
{
assert(list != NULL);
node *p = list->head->next;
node *q = NULL;
while (p != list->tail)
{
q = p->next;
free(p);
p = q;
}
free(list->head);
free(list->tail);
list->head = NULL;
list->tail = NULL;
free(list);
}
int main()
{
link_list *list = InitLinkList();
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
if (x == 0)
{
scanf("%d", &x);
LinkListPushBack(list, x);
}
else if (x == 1)
{
scanf("%d", &x);
LinkListPushFront(list, x);
}
else if (x == 2)
{
LinkListPopBack(list);
}
else if (x == 3)
{
LinkListPopFront(list);
}
else if (x == 4)
{
scanf("%d", &x);
printf("查找的结果是%d\n", LinkListFind(list, x));
}
else if(x == 5)
{
scanf("%d", &x);
RemoveLinkListNode(list, x);
}
PrintLinkList(list);
}
DeleteLinkList(list);
return 0;
}
3.注意
1.博客中标注原创的文章,版权归作者所有;
2.未经作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。