您的位置:首页 > 其它

单链表的基本操作

2017-10-19 19:07 197 查看
[align=center]单链表的基本操作[/align]

[align=left]1、头文件(list.h)[/align]
#pragma once
//带头节点的单链表,尾节点的next为NULL
//头节点起哨兵位作用,它不使用(数据域不能存储数据)

typedef struct Node
{
int data;//保存数据
struct Node *next;//保存下一节点的地址
}Node,*List;//List == Node*

//typedef struct Node *List;

//链表初始化
void InitList(List plist);

//头插
bool Insert_head(List plist,int val);

//尾插
bool Insert_tail(List plist,int val);

//查找
Node *Search(List plist,int key);

//删除
bool Delete(List plist,int key);

//获取单链表的长度
int GetLength(List plist);

//判空
bool IsEmpty(List plist);

//清空
void Clear(List plist);

//摧毁
void Destroy(List plist);

//打印
void Show(List plist);

//获取元素
bool GetElem(List plist,int pos,int *rtval);

//逆置
void Reverse(List plist);//考试的重点内容

//除去重复的数据值
void Unique(List plist);


[align=left]2、源文件[/align]
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"list.h"

//链表初始化
void InitList(List plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return ;
}

plist->next = NULL;
}

//头插 时间复杂度O(1)
bool Insert_head(List plist,int val)
{
assert(plist != NULL);
if(plist == NULL)
{
return false;
}

Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
p->next = plist->next;
plist->next = p;

return true;
}

//尾插
bool Insert_tail(List plist,int val)
{

Node *p = (Node *)malloc(sizeof(Node *));
p->data = val;

Node *q;
for(q = plist;q->next != NULL;q = q->next);

q->next = p;
p->next = NULL;

return true;
}

//查找
Node *Search(List plist,int key)
{
assert(plist != NULL);
if(plist == NULL)
{
return false;
}

for(Node *p = plist->next;p != NULL;p = p->next)
{
if(p->data == key)
{
return p;
}
}
return NULL;
}

//删除
bool Delete(List plist,int key)
{
Node *p;
for(p = plist;p->next != NULL;p = p->next)
{
if(p->next->data == key)
{
Node *q = p->next;//记录即将要删除的结点
p->next = q->next;
free(q);

return true;
}
}
return false;
}

//获取单链表的长度
int GetLength(List plist)
{
int count = 0;
for(Node *p = plist->next;p != NULL;p = p->next)
{
count++;
}
return count;
}

//判空
bool IsEmpty(List plist)
{
return plist->next == NULL;
}

//清空
void Clear(List plist)
{
Destroy(plist);
}

//摧毁
void Destroy(List plist)
{
Node *p;
while(plist->next != NULL)
{
p = plist->next;
plist->next = p->next;
free(p);
}
}

//打印
void Show(List plist)
{
for(Node *p = plist->next;p != NULL;p = p->next)
{
printf("%d ",p->data);
}
printf("\n");
}

//获取元素
bool GetElem(List plist,int pos,int *rtval)
{
if(pos < 0 || pos >= GetLength(plist))
{
return false;
}

int i = 0;
for(Node *p = plist->next;p != NULL;p= p->next)
{
if(i == pos)
{
*rtval = p->data;
return true;
}
i++;
}

return false;
}

//得到结点p的前驱
static Node *GetPri(List plist,Node *p)
{
for(Node *q=plist;q->next !=NULL ;q=q->next)
{
if(q->next == p)
{
return q;
}
}

return NULL;
}

//逆置
void Reverse(List plist)//考试的重点内容
{
if(plist == NULL || plist->next == NULL || plist->next->next == NULL)
{
return ;
}

//时间复杂度为O(n),并且最好,利用了头插法的思想
Node *p = plist->next;
Node *q;
plist->next = NULL;

while(p != NULL)
{
q = p->next;

p->next = plist->next;
plist->next = p;

p = q;
}

/*
//时间复杂度为O(n^2)
Node *p = plist->next;
Node *q;
int tmp;

for(q = plist;q->next != NULL;q = q->next);

for(int i = 0;i < GetLength(plist)/2;i++)
{
tmp = p->data;
p->data = q->data;
q->data = tmp;

p = p->next;
q= GetPri(plist,q);
}*/

}
//除去重复的数据值
void Unique(List plist)
{
Node *p;
Node *q;

for(p = plist->next;p != NULL;p = p->next)
{
for(q = p;q->next != NULL;q = q->next)
{
if(q->next->data == p->data)
{
Node *s = q->next;
q->next = s->next;
free(s);
}
}
}
}


[align=left]3、测试源文件[/align]

#include<stdio.h>
#include<vld.h>
#include"list.h"

int main()
{
Node head1;
Node head2;

InitList(&head1);
InitList(&head2);

for(int i = 0;i < 15;i++)
{
Insert_head(&head1,i);
Insert_tail(&head2,i);
}

Show(&head1);
Show(&head2);

Reverse(&head1);
Show(&head1);

int val;
GetElem(&head2,3,&val);
printf("%d\n",val);

Destroy(&head1);
Destroy(&head1);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: