链表基础操作
介绍
链表是一种非常基础的数据结构,也很重要,也比较简单,所以就不多加赘述直接给出代码,这里采用的是尾接法建立链表,实现了增、删、查、遍历、求长度的功能
代码实现及结果
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <windows.h>
typedef struct NODE
{
int data;
struct NODE *pNext;
} node; //定义链表节点的类型
node *create_node(int size); //创建链表
bool insert_node(node *, int, int);
bool is_empty(node *);
bool delete_node(node *, int,int*);
int search_node(node *, int);
int length_node(node *);
void print_node(node *pHead); //打印链表
int main()
{
node *pHead;
int length;
int val;
printf("please put the length of list:");
scanf("%d", &length);
pHead = create_node(length);
print_node(pHead);
printf("\n");
insert_node(pHead,2, 2);
print_node(pHead);
printf("\n");
delete_node(pHead, 2, &val);
print_node(pHead);
printf("\n");
printf("%d has been deleted\n", val);
printf("the length of nodelist is %d\n", length_node(pHead));
printf("the position of 3 is:%d",search_node(pHead, 3));
}
node *create_node(int size)
{
int i, val;
node *phead = (node *)malloc(sizeof(node)); //创建头节点的“分身”,利用“分身”创建一个链表之后返回分身地址,pHead就构成了一个链表的头节点
phead->pNext = NULL;
node *p = phead;
for (i = 0; i < size; i++) //根据输入的length创建新节点
{
node *pNew = (node *)malloc(sizeof(node));
scanf("%d", &val);
pNew->data = val;
p->pNext = pNew; //先让新节点指针指向头节点后继节点
p = pNew; //再让头节点指向新节点
}
p->pNext = NULL; //尾节点要置NULL否则野指针循环无法结束
return phead;
}
bool insert_node(node *pHead, int position, int val)
{
node *p = pHead;
int i;
for (i = 1; i < position;i++) //让p指向要插入位置的前一个结点
{
p = p->pNext;
}
node *pNew = (node *)malloc(sizeof(node));
pNew->data = val;
pNew->pNext = NULL;
pNew->pNext = p->pNext; //这两步顺序不可以颠倒,否则会造成指针丢失
p->pNext = pNew;
}
bool is_empty(node* pHead)
{
if(pHead->pNext==NULL)
{
return true;
}else
{
return false;
}
}
bool delete_node(node* pHead,int position,int* val)
{
node *p = pHead;
int i;
if(is_empty(pHead))
{
return false;
}
for (i = 1; i < position; i++) //让p指向要删除位置的前一个结点
{
p = p->pNext;
}
node *temp = p->pNext; //临时节点存储删除节点的地址便于手动释放内存
p->pNext = temp->pNext;//更新节点的指向关系
*val = temp->data; //储存删除节点的值
free(temp); //手动释放动态内存
temp = NULL; //节点置空
return true;
}
int length_node(node* pHead)
{
int cnt = 0;
node *p = pHead;
while(p!=NULL)
{
cnt++;
p = p->pNext;
}
return cnt;
}
int search_node(node* pHead,int val)
{
node *p = pHead->pNext;
int position=1;
while(p!=NULL)
{
if(p->data==val)
{
return position;
}
p = p->pNext;
position++;
}
return -1;
}
void print_node(node *pHead)
{
printf("It's the time to print node.\n");
node *q = pHead->pNext;
while (q != NULL)
{
printf("%d\t", q->data);
q = q->pNext;
}
q = NULL;
}
