您的位置:首页 > 其它

单链表的增删查改等操作实现

2017-07-30 11:53 441 查看
//.h
#ifndef  __LINK_LIST__
#define  __LINKLIST__
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DateType;
typedef struct Node
{
DateType data;
struct Node* next;
}Node,*pNode,list;
//初始化链表和销毁链表
void InitLinkList(list** pplist);
void Destroylist(list**pplist);
//尾部插入和删除元素
void pushback(list**pplist,DateType x);
void popback(list**pplist);
//头部插入和删除元素
void pushfront(list**pplist, DateType x);
void popfront(list**pplist);
//查找
pNode find(list *plist, DateType x);
//指定位置插入和删除
void insert(list **pplist,int pos, DateType x);
void erase(list**pplist, int pos);
//删除指定元素
void Remove(list**pplist, DateType x);
//删除指定所有元素
void Removeall(list**pplist, DateType x);
//遍历链表
void display(list* plist);
#endif
//.c
#include"linklis.h"
void display(list* plist)
{
assert(plist);
while (plist != NULL)
{
printf("%d ", plist->data);
plist = plist->next;
}
printf("\n");
}

void InitLinkList(list** pplist)
{
assert(pplist);
*pplist = NULL;
}
void Destroylist(list**pplist)
{
assert(pplist);
while (*pplist != NULL)
{
pNode temp = (*pplist)->next;
free(*pplist);
*pplist = temp;
}
}
//尾插
void pushback(list**pplist,DateType x)
{
assert(pplist);
pNode head = *pplist;
pNode temp = (pNode)malloc(sizeof(Node));
if (!temp)
{
perror("malloc");
exit(EXIT_FAILURE);
}
temp->data = x;
temp->next = NULL;
if (head == NULL)//空链表处理
{
*pplist = temp;
return;
}
while (head->next != NULL)//非空链表处理
{
head = head->next;
}
head->next = temp;
}
//尾删
void popback(list**pplist)
{
assert(pplist);
pNode head = *pplist;
pNode ptemp = NULL;
if (*pplist == NULL)//空链表处理
return;
if ((*pplist)->next == NULL)//一个节点的处理
{
free(*pplist);
*pplist = NULL;
return;
}
while (head->next != NULL)//多节点处理
{
ptemp = head;
head = head->next;
}
free(ptemp->next);
ptemp->next = NULL;
}
//头插
void pushfront(list**pplist,DateType x)
{
assert(pplist);
pNode node = (pNode)malloc(sizeof(Node));
if (node == NULL)
{
perror("malloc");
exit(EXIT_FAILURE);
}
node->data = x;
node->next = NULL;
node->next = *pplist;
*pplist = node;
}
//头删
void popfront(list**pplist)
{
assert(pplist);
if (*pplist == NULL)
return;
pNode temp=NULL;
temp = *pplist;
*pplist = (*pplist)->next;
free(temp);
}
//查找
pNode find(list *plist, DateType x)
{
assert(plist);
pNode head = plist;
while (head != NULL)
{
if (head->data == x)
return head;
head = head->next;
}
return NULL;
}
//指定位置插入,头节点位置为1
void insert(list **pplist, int pos, DateType x)
{
assert(pplist);
int i = 1;
pNode head = *pplist;
pNode temp = (pNode)malloc(sizeof(Node));
if (temp == NULL)
{
perror("malloc");
exit(EXIT_FAILURE);
}
temp->data = x;
temp->next = NULL;
if (head == NULL)//空链表处理
{
*pplist = temp;
return;
}
if (pos <= 1)//插入位置为1或小于1处理
{
temp->next = *pplist;
*pplist = temp;
return;
}
while( (i < pos-1)&&(head->next != NULL))//插入位置大于1处理
{
head = head->next;
i++;
}
temp->next = head->next;
head->next = temp;
}
//删除指定位置,头节点位置为1
void erase(list**pplist, int pos)
{
assert(pplist);
pNode head = *pplist;
pNode temp = *pplist;
int i = 1;
//空链表处理
if (head == NULL)
return;
//一个节点处理
if (head->next == NULL)
{
free(head);
*pplist = NULL;
return;
}
//删除位置小于等于1时处理
if (pos <= 1)
{
temp = (*pplist)->next;
free(*pplist);
*pplist = temp;
return;
}
//删除位置大于1时处理
while (i < pos && head->next!= NULL)
{
temp = head;
head = head->next;
i++;
}
head = temp->next->next;
free(temp->next);
temp->next = head;
}
//删除指定元素
void Remove(list**pplist, DateType x)
{
assert(pplist);
pNode head = *pplist;
pNode temp = NULL;
//空链表时处理
if (head == NULL)
return;
//当指定元素为头节点时处理
if ((*pplist)->data == x)
{
*pplist = (*pplist)->next;
return;
}
//当指定元素为非头节点时处理
while (head!= NULL)
{
if (head->data == x)
{
head = head->next;
free(temp->next);
temp->next = head;
return;
}
temp = head;
head = head->next;
}
}
//删除指定所有元素
void Removeall(list**pplist, DateType x)
{
assert(pplist);
pNode head = *pplist;
pNode temp = NULL;
//空链表时处理
if (head == NULL)
return;
//删除指定所有元素,只要遍历该链表,然后删除指定元素
while (head!= NULL)
{
//删除的指定元素为头节点处理
if ((*pplist)->data == x)
{
*pplist = (*pplist)->next;
head = *pplist;
//结束本次循环
continue;
}
if (head->data == x)
{
//head的指向本节点的下一个节点
head = head->next;
//删除指定元素
free(temp->next);
//保存下一个节点的位置
temp->next = head;
continue;
}
//其他情况时
//使temp保存当前节点的位置
temp = head;
//使head指向下一个节点
head = head->next;
}
}
//.c
#include"linklis.h"
int main()
{
list*List;
InitLinkList(&List);
//pushback(&List, 1);
//display(List);
//pushback(&List, 2);
//display(List);
//pushback(&List, 3);
//display(List);
//pushback(&List, 4);
//display(List);
//pushback(&List, 5);
//display(List);
//popback(&List);
//display(List);
//popback(&List);
//display(List);
//popback(&List);
//display(List);
//popback(&List);
//display(List);
//popback(&List);
//display(List);
pushfront(&List, 1);
display(List);
pushfront(&List, 2);
display(List);
pushfront(&List, 3);
display(List);
pushfront(&List, 4);
display(List);
pushfront(&List, 5);
display(List);
/*popfront(&List);
display(List);
popfront(&List);
display(List);
popfront(&List);
display(List);*/
//insert(&List, 3, 1);
//display(List);
//insert(&List, 9, 9);
//display(List);
//insert(&List, 7, 8);
//display(List);
//insert(&List, 1, 6);
//display(List);
//erase(&List, 1);
//display(List);
//erase(&List, 7);
//display(List);
//erase(&List, 9);
//display(List);
//erase(&List, 3);
//display(List);
//pushfront(&List, 1);
//display(List);
//pushfront(&List, 1);
//display(List);
//pushfront(&List, 1);
//display(List);
//pushfront(&List, 1);
//display(List);
//pushfront(&List, 1);
//display(List);
//pushfront(&List, 1);
//display(List);
//Removeall(&List, 1);
//display(List);
//Remove(&List, 3);
//display(List);
//Remove(&List, 2);
//display(List);
//Remove(&List, 4);
//display(List);
//Remove(&List, 5);
//display(List);
/*if (find(List, 2) != NULL)
printf("找到了\n");
else
printf("没有找到\n");*/
Destroylist(&List);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: