2-7单链表删除元素操作、删除单链表整个表
全局数据结构头文件(见上篇文章)
上一篇里也有链表的超多操作哦
单链表头文件 linklist.h
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include "DataElement.h"
#include <stdbool.h>
typedef struct Node{
ElementType data;
struct Node* next;
}Node;
typedef struct LinkList{
Node* next ;
int length;
}LinkList;
void InitLinkList(LinkList * linkList,ElementType* dataArray,int length);
void InsertLinkList(LinkList* linklist,ElementType element,int pos);
void PrintLinkList(LinkList* linkList);
int IsLinkListEmpty(LinkList* linklist);
ElementType GetLinkListElement(LinkList* linklist,int pos);
ElementType DeleteLinkListElement(LinkList* linkList,int pos);
void ClearLinkList(LinkList* linklist);
#endif
实现文件 linklist.c
#include "LinkList.h"
void InitLinkList(LinkList * linkList,ElementType* dataArray,int length)
{
for(int i= 1;i <= length;i++){
InsertLinkList(linkList,dataArray[i-1],i);
}
return;
}
void InsertLinkList(LinkList* linklist,ElementType element,int pos)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = element;
new_node->next = NULL;
if(pos == 1){
new_node->next = linklist->next;
linklist->next = new_node;
linklist->length ++;
return;
}
Node* p = linklist->next;
for(int i = 1;p &&i < pos - 1;i++){
p = p->next;
}
if(!p){
printf("该位置不存在\n");
return;
}
else{
new_node->next = p->next;
p->next = new_node;
p = NULL;
linklist->length++;
return;
}
}
void PrintLinkList(LinkList * linkList)
{
Node* p = linkList->next;
if(!p){
printf("链表为空\n");
linkList->length = 0;
return;
}
while(p)
{
printf("%d\t%s\n",p->data.id,p->data.name);
p = p->next;
}
return;
}
int IsLinkListEmpty(LinkList* linklist)
{
return linklist->length == 0 ? true : false;
}
ElementType GetLinkListElement(LinkList* linklist,int pos)
{
Node* p = linklist->next;
for(int i = 1;p && i < pos;i++){
p = p->next;
}
return p->data;
}
ElementType DeleteLinkListElement(LinkList* linkList,int pos)
{
printf("删除元素中\n");
if(pos > linkList->length){
printf("pos不合法,该位置元素无法删除\n");
return;
}
else{
Node* pre_node;
Node* del_node = linkList->next;
if(pos == 1){
linkList->next = del_node->next;
free(del_node);
linkList->length--;
}
else{
for(int i = 1;i < pos;i++)
{
pre_node = del_node;
del_node = del_node->next;
}
ElementType ret_element;
del_node->data = ret_element;
pre_node->next = del_node->next;
free(del_node);
linkList->length--;
return ret_element;
}
}
}
void ClearLinkList(LinkList* linklist)
{
printf("开始删除整个单链表\n");
Node* p;
Node* q;
p = linklist->next;
while(p){
q = p->next;
free(p);
p = q;
}
linklist->next = NULL;
linklist->length = 0;
printf("删除完成\n");
return;
}
测试文件
#include <stdio.h>
#include <stdlib.h>
#include "SequenceList.h"
#include "DataElement.h"
#include "LinkList.h"
void TestSequenceList();
void TestLinkList();
int main()
{
TestLinkList();
return 0;
}
void TestSequenceList()
{
ElementType dataArray[] = {
{1,"海绵宝宝"},
{2,"派大星"},
{3,"章鱼哥"},
{4,"蟹老板"},
{5,"痞老板"}
};
SeqList seqlist;
InitList(&seqlist,dataArray,sizeof(dataArray) / sizeof(dataArray[0]));
PrintList(&seqlist);
int del = -1,get = -1;
printf("下面进行删除操作测试\n请输入删除元素的索引值:");
scanf("%d",&del);
ElementType* del_element = DeleteElement(&seqlist,del);
printf("删除之后的结果为:\n");
PrintList(&seqlist);
printf("所删除的元素是:%d\t%s\n",del_element->id,del_element->name);
printf("请输入要查找的元素的索引:");
scanf("%d",&get);
ElementType* get_element = GetElement(&seqlist,get);
printf("您所查找的元素为:%d\t%s:",get_element->id,get_element->name);
free(del_element);
}
void TestLinkList()
{
ElementType dataArray[] = {
{1,"海绵宝宝"},
{2,"派大星"},
{3,"章鱼哥"},
{4,"蟹老板"},
{5,"痞老板"}
};
LinkList linklist;
linklist.length = 0;
linklist.next = NULL;
InitLinkList(&linklist,dataArray,sizeof(dataArray)/sizeof(dataArray[0]));
PrintLinkList(&linklist);
printf("\n");
ElementType new_node_element;
new_node_element.id = 6;
new_node_element.name = "xxxxx";
InsertLinkList(&linklist,new_node_element,2);
PrintLinkList(&linklist);
printf("是否为空?\t%d\n",IsLinkListEmpty(&linklist));
printf("第3位元素为%d\t%s\n",GetLinkListElement(&linklist,3));
ElementType del_data;
del_data = DeleteLinkListElement(&linklist,3);
printf("删除的元素为%d\t%s\n",del_data.id,del_data.name);
PrintLinkList(&linklist);
ClearLinkList(&linklist);
PrintLinkList(&linklist);
return;
}