要求:使用封装工程代码完成链表的定义、创建、头插入、显示、删除、查找、替换、尾插入等功能。
其定义为:
(1)创建链表:
list_node_t *create_linklist(void)
(2)链表头插入:
int insert_head_linklist(list_node_t *phead, datatype tmdata)
(3)链表元素显示:
int show_linklist(list_node_t *phead)
(4)链表元素删除:
int delete_linklist(list_node_t *phead, datatype tmpdata)
(5)链表元素查找:
int find_linklist(list_node_t *phead, datatype tmpdata)
(6)链表元素替换:
int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata)
(7)链表尾插入:
int append_linklist(list_node_t *phead, datatype tmpdata)
要实现以下函数需要创建3个文件,分别为:main.c , linklist.c , linklist.h 。使用此格式可以更方便阅读和编写。
主函数 main.c ↓↓↓↓↓
#include<stdio.h>
#include"linklist.h"
#include<stdlib.h>
#include<string.h>
int main(void)
{
list_node_t *plist = NULL;
plist = create_linklist();
printf("头插后:\n");
insert_head_linklist(plist, 1);
insert_head_linklist(plist, 2);
insert_head_linklist(plist, 3);
insert_head_linklist(plist, 4);
show_linklist(plist);
printf("\n");
printf("删除2后:\n");
delete_linklist(plist, 2);
show_linklist(plist);
printf("\n");
printf("3地址查询:\n");
find_linklist(plist, 3);
printf("3替换4后:\n");
replace_linklist(plist, 3, 4);
show_linklist(plist);
printf("\n");
printf("尾插后:\n");
append_linklist(plist, 5);
append_linklist(plist, 6);
show_linklist(plist);
printf("\n");
return 0;
}
封装函数 linklist.c ↓↓↓↓↓
nclude<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
list_node_t *create_linklist(void)
{
list_node_t *ptmpnode = NULL;
ptmpnode =malloc(sizeof(list_node_t));
if(NULL == ptmpnode)
{
return NULL;
}
ptmpnode->pnext = NULL;
return ptmpnode;
}
//头插法
int insert_head_linklist(list_node_t *phead, datatype tmdata)
{
list_node_t *ptmpnode = NULL;
ptmpnode = malloc(sizeof(list_node_t));
if(NULL == ptmpnode)
{
return -1;
}
ptmpnode->pnext = phead->pnext;
ptmpnode->data = tmdata;
phead->pnext = ptmpnode;
return 0;
}
//显示
int show_linklist(list_node_t *phead)
{
list_node_t *ptmpnode = NULL;
ptmpnode = phead->pnext;
while(ptmpnode != NULL)
{
printf("%d ", ptmpnode->data);
ptmpnode = ptmpnode->pnext;
}
return 0;
}
//删除
int delete_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pprenode = NULL;
pprenode = phead;
ptmpnode = phead->pnext;
while(ptmpnode != NULL)
{
if(ptmpnode->data == tmpdata)
{
pprenode->pnext = ptmpnode->pnext;
free(ptmpnode);
ptmpnode = pprenode->pnext;
}
else
{
ptmpnode = ptmpnode->pnext;
pprenode = pprenode->pnext;
}
}
return 0;
}
//查找
int find_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
int i = 0;
ptmpnode = phead;
while(ptmpnode != NULL)
{
if(ptmpnode->data == tmpdata)
{
printf("%d 的地址为 %p\n", tmpdata, (void*)ptmpnode);
ptmpnode = ptmpnode->pnext;
i++;
}
else
{
ptmpnode = ptmpnode->pnext;
}
}
if(i == 0)
{
printf("未找到此数\n");
}
return 0;
}
//替换
int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata)
{
list_node_t *ptmpnode = NULL;
int i = 0;
ptmpnode = phead;
while (ptmpnode != NULL)
{
if(ptmpnode->data == olddata)
{
ptmpnode->data = newdata;
ptmpnode = ptmpnode->pnext;
i++;
}
else
{
ptmpnode = ptmpnode->pnext;
}
}
if(i == 0)
{
printf("此数未替换完成");
}
return 0;
}
//尾插法
int append_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pprenode = NULL;
ptmpnode = malloc(sizeof(list_node_t));
if(ptmpnode == NULL)
{
return -1;
}
pprenode = phead;
while(pprenode->pnext != NULL)
{
pprenode = pprenode->pnext;
}
pprenode->pnext = ptmpnode;
ptmpnode->data = tmpdata;
ptmpnode->pnext = NULL;
return 0;
}
结构体函数 linklist.h ↓↓↓↓↓
nclude<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
list_node_t *create_linklist(void)
{
list_node_t *ptmpnode = NULL;
ptmpnode =malloc(sizeof(list_node_t));
if(NULL == ptmpnode)
{
return NULL;
}
ptmpnode->pnext = NULL;
return ptmpnode;
}
//头插法
int insert_head_linklist(list_node_t *phead, datatype tmdata)
{
list_node_t *ptmpnode = NULL;
ptmpnode = malloc(sizeof(list_node_t));
if(NULL == ptmpnode)
{
return -1;
}
ptmpnode->pnext = phead->pnext;
ptmpnode->data = tmdata;
phead->pnext = ptmpnode;
return 0;
}
//显示
int show_linklist(list_node_t *phead)
{
list_node_t *ptmpnode = NULL;
ptmpnode = phead->pnext;
while(ptmpnode != NULL)
{
printf("%d ", ptmpnode->data);
ptmpnode = ptmpnode->pnext;
}
return 0;
}
//删除
int delete_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pprenode = NULL;
pprenode = phead;
ptmpnode = phead->pnext;
while(ptmpnode != NULL)
{
if(ptmpnode->data == tmpdata)
{
pprenode->pnext = ptmpnode->pnext;
free(ptmpnode);
ptmpnode = pprenode->pnext;
}
else
{
ptmpnode = ptmpnode->pnext;
pprenode = pprenode->pnext;
}
}
return 0;
}
//查找
int find_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
int i = 0;
ptmpnode = phead;
while(ptmpnode != NULL)
{
if(ptmpnode->data == tmpdata)
{
printf("%d 的地址为 %p\n", tmpdata, (void*)ptmpnode);
ptmpnode = ptmpnode->pnext;
i++;
}
else
{
ptmpnode = ptmpnode->pnext;
}
}
if(i == 0)
{
printf("未找到此数\n");
}
return 0;
}
//替换
int replace_linklist(list_node_t *phead, datatype olddata, datatype newdata)
{
list_node_t *ptmpnode = NULL;
int i = 0;
ptmpnode = phead;
while (ptmpnode != NULL)
{
if(ptmpnode->data == olddata)
{
ptmpnode->data = newdata;
ptmpnode = ptmpnode->pnext;
i++;
}
else
{
ptmpnode = ptmpnode->pnext;
}
}
if(i == 0)
{
printf("此数未替换完成");
}
return 0;
}
//尾插法
int append_linklist(list_node_t *phead, datatype tmpdata)
{
list_node_t *ptmpnode = NULL;
list_node_t *pprenode = NULL;
ptmpnode = malloc(sizeof(list_node_t));
if(ptmpnode == NULL)
{
return -1;
}
pprenode = phead;
while(pprenode->pnext != NULL)
{
pprenode = pprenode->pnext;
}
pprenode->pnext = ptmpnode;
ptmpnode->data = tmpdata;
ptmpnode->pnext = NULL;
return 0;
}