您的位置:首页 > 理论基础 > 数据结构算法

数据结构实践---单链表的初始化,建立,插入,查找,删除。

2015-05-19 21:18 615 查看
linklist.h

////////////////////////////////////////////////
/**单链表的初始化,建立,插入,查找,删除*/
///////////////////////////////////////////////
/*******     linklist.h      **********/

#ifndef _LINKLIST_H
#define _LINKLIST_H

#include <cstdio>
#include <cstdlib>

typedef int ElemType;
/////////////////////////////////////////////

/**定义结点类型*/
typedef struct Node
{
ElemType data;        //单链表中的数据域
struct Node *next;    //单链表的指针域
}Node,*LinkList;

/////////////////////////////////////////////
/**单链表的初始化*/
extern LinkList LinkListInit();
/**单链表的建立1,头插法建立单链表*/
extern LinkList LinkListCreatH();
/**单链表的建立2,尾插法建立单链表*/
extern LinkList LinkListCreatT();
/**单链表的插入,在链表的第i个位置插入x元素*/
extern LinkList LinkListInsert(LinkList L,int i,ElemType x);
/**单链表的删除,在链表中删除值为x的元素*/
extern LinkList LinkListDelete(LinkList L,ElemType x);
/////////////////////////////////////////////////////////////

#endif


linklist.cpp

/*********     linklist.cpp   **********/

#include "linklist.h"
#include <iostream>
using namespace std;

///////////////////////////////////////////////
//单链表的初始化
LinkList LinkListInit()
{
Node *L;
L = (Node *)malloc(sizeof(Node));    //申请结点空间
if (NULL==L)                    //判断是否有足够的结点空间
{
cout<<"申请内存空间失败!"<<endl;
}
L->next = NULL;                    //将next设置为NULL,初始长度为0的单链表
return L;
}

//////////////////////////////////////////////
//头插法建立单链表
LinkList LinkListCreatH()
{
Node *L;
L = (Node *)malloc(sizeof(Node));    //申请头结点空间
L->next=NULL;                        //初始化一个空链表

ElemType x;                            //x为链表数据域中的数据
while(cin>>x)
{
Node *p;
p=(Node*)malloc(sizeof(Node));    //申请新的结点
p->data=x;                        //结点数据域赋值
p->next=L->next;                //将结点插入到表头
L->next=p;                        //头指针指向新插入的结点形成新链
}
return L;
}

///////////////////////////////////////////////////
//尾插法建立单链表
LinkList LinkListCreatT()
{
Node *L;
L = (Node *)malloc(sizeof(Node));        //申请头结点空间
L->next=NULL;                            //初始化一个空链表
Node *r;
r = L;                                    //r起初指向头结点(存放L的地址),接下来始终指向终端结点
ElemType x;
while(cin>>x)
{
Node *p;
p = (Node *)malloc(sizeof(Node));        //申请新的结点
p->data=x;                                //结点数据域赋值
r->next=p;                                //将结点插入到表头
r=p;                                    //将r指针指向新插入结点的位置,实现循环插入
}
r->next=NULL;

return L;
}

////////////////////////////////////////////////////
//单链表的插入
LinkList LinkListInsert(LinkList L,int i,ElemType x)
{
Node *pre;                                    //pre为前驱节点
pre = L;                                    //初始指向头结点,从头开始找位置i
int temp = 0;
for(temp=1;temp<i;temp++)
pre=pre->next;                            //查找第i个位置的前驱结点
Node *p;                                    //插入的结点为p
p = (Node *)malloc(sizeof(Node));
p->data =x;
p->next=pre->next;
pre->next=p;

return L;
}

////////////////////////////////////////////////////////
//单链表的删除
LinkList LinkListDelete(LinkList L,ElemType x)
{
Node *p,*pre;                    //pre为前驱结点,p为查找的结点
p = L;                            //p指向头结点
while(p->data!=x)                //查找值为x的元素
{
pre = p;                    //pre和p总是指向同一个结点
p=p->next;                    //循环查找
}
pre->next=p->next;                //删除操作,将其(p)前驱next指向其(p)后继
free(p);
return L;
}


main.cpp

/***********       main.cpp           ***************/

#include "linklist.h"
#include <iostream>
using namespace std;

int main()
{
LinkList list,start;
list=LinkListInit();
/*
cout<<"请输入单链表的数据"<<endl;
list = LinkListCreatH();
for (start=list->next;start!=NULL;start=start->next)
cout<<start->data<<" ";
cout<<endl;
*/

cout<<"请输入单链表的数据"<<endl;
list = LinkListCreatT();
for (start=list->next;start!=NULL;start=start->next)
cout<<start->data<<" ";
cout<<endl;

int i;
ElemType x;
cout<<"请输入数据的位置"<<endl;
scanf("%d",&i);
cout<<"请输入插入数据的值"<<endl;
scanf("%d",&x);
LinkListInsert(list,i,x);
for (start=list->next;start!=NULL;start=start->next)
cout<<start->data<<" ";
cout<<endl;
cout<<"请输入要删除元素的值"<<endl;
scanf("%d",&x);
LinkListDelete(list,x);
for(start=list->next;start!=NULL;start=start->next)
cout<<start->data<<" ";
cout<<endl;

return 0;
}


头插法的结果:



尾插法的结果:

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