永发信息网

题目:单链表操作验证(根据提示改为c语言)

答案:1  悬赏:60  手机版
解决时间 2021-04-25 10:36

题目:单链表操作验证

1.实验目的

(1)掌握线性表的链接存储结构;

(2)验证单链表及其基本操作的实现;

(3)进一步掌握数据结构及算法的程序实现的基本方法。

2.实验内容

(1)用头插法(或尾插法)建立带头结点的单链表;

(2)对已建立的单链表实现插人、删除、查找等基本操作。

3.实现提示(此为C++版,具体实验用C语言实现,下同)

首先,将单链表中的结点定义为如下结构类型:

template <class T>

struct Node

T data;

Node<T> *next;

};

其次,定义单链表的数据类型——单链表类LinkList,包括题目要求的插人、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出单链表的元素。

template<class T>

class LinkList

public:

LinkList(T a[ ],int n); //建立有n个元素的单链表

~LinkList( ); //析构函数

void Insert(int i,T x); //在单链表中第i个位置插入元素值为x的结点

T Delete(int i); //在单链表中删除第i个结点

int Locate(T x); //求单链表中值为x的元素序号

void PrintList(); //遍历单链表,按序号依次输出各元素

private:

Node<T>*first; //单链表的头指针

};

再次,设计单链表类LinkList的构造函数和析构函数。

用头插法或尾插法建立单链表。头插法建立单链表的算法如下:

头插法建立单链表

temlate <class T>

LinkList::LinkList(T a[],int n)

{

first=new Node<T>;

first->next=NULL; //初始化一个空链表

for(i=0;i<n;i++)

{

s=new Node<T>; s->data=a[i]; //为每个数组元素建立一个结点

s->next=first->next;//插入到头结点之后

first->next=s;

}

}

析构函数用于释放单链表中所有结点,算法如下:

单链表的析构函数算法~LinkList

template :: ~LinkList()

{

p=first; //工作指针P初始化

while(p) //释放单链表的每一个结点的存储空间

{

q=p; //暂存被释放结点

p=p->next; //工作指针P指向被释放结点,使单链表不断开

delete q;

}

}

最后,对所建立的单链表设计插人、删除、查找等基本操作的算法。

(l)插人算法

单链表插人算法Insert

template<class T>

void LinkList::Insert(int i,T x)

{

p=first;j=0; //工作指针P初始化

while (p && j<i-1)

{

p=p->next; //工作指针P后移

j++;

}

if (! p) throw“位置”;

else{

s=new Node<T>; s->data=x; //向内存申请一个结点s,其数据域为x

s->next=p->next;//将节点s插入到结点p之后

p->next=s;

}

}

(2)删除算法

单链表的删除算法Delete

Template<class T>

T LinkList::Delete(int i)

{

P=first ;j=0;//工作指针p初始化

While (p && j<i-1) //查找第i-1个结点

{

p=p->next;

j++;

}

if ( ! p | | ! p->next) throw“位置”; //结点p不存在或结点p的后继结点不存在

else{

q=p->next; x=q->data; //暂存被删结点

p->next=q->next; //摘链

delete q;

return x;

}

}

(3)查找算法

单链表查找算法Locate

template <class T>

int LinkList::Locate(T x)

{

p=first->next; j=1;

while(p && p->data!=x)

{

p=p->next; //工作指针p后移

j++;

}

if (p) return j;

else return 0;

}

4.实验程序

//以下为头函数,文件名为LinkList.h

#ifndef LinkList_H

#define LinkList_H

template<class T>

struct Node

{

T data;

Node< T> *next; //此处<T>也可以省略

};

template <class T>

class LinkList

{

Public:

LinkList(T a[],int n); //建立有n个元素的单链表

~LinkList(); //析构函数

void Insert(int i, T x); //在单链表中第i个位置播入元素为x的结点

T Delete(int i); //在单链表中删除第i个结点

int Locate(T x); //求单链表中值为x的元素序号

void PrintList(); // 遍历单链表,按序号依次输出各元素

private:

Node<T> *first; //单链表的头指针

};

#endif

//以下为头函数LinkList.h中LinkList类的成员函数按规定定义,文件名为LinkList.cpp

#include"LinkList.h"

template <class T>

LinkList<T>::LinkList(T a[],int n)

{

Node<T> * first;

first=new Node<T>;

first->next=NULL; //初始化一个空链表

for(int i=0;i<n; i++)

Node<T> *s;

s=new Node<T>; s->data=a[i]; //为每个数组元素建立一个结点

s->next=first->next; //插入到头结点之后

first->next=s;

}

template <class T>

LinkList::~LinkList()

{

Node<T> *p, *q;

p= first; //工作指针P初始化

while(p) //释放单链表的每一个结点的存储空间

q=p; //暂存被释放结点

p=->next; //工作指针P指向被释放结点的下一个结点,//使单链表不断开

delete q;

}

template <class T>

void LinkList<T>::Insert(int i,T x)

{

Node<T> *p; int j;

p=first;j=0; //工作指针p初始化

while(P && 7<I-1)

{

P=P->next; //工作指针P后移

j++;

}

if(!p) throw”位置”,

else{

Node<T> *s;

s=new Node<T>;

s->data = x; //向内存申请一个结点:,其数据域为x

s->next=p->next; //结点s插人到结点p之后

P->next=s;

template <class T>

T LinkList<T>::Delete(int i)

{

Node<T> *p;int j;

P=first;j=0; //工作指针P初始化

while (p“j<I-1) //查找第i-1个结点

p=p->next;

j++;

if(!P||!P->next) throw“位置”;//结点P不存在或结点P的后继结点不存在

else{

Node<T> *q;int x;

q=p->next; x=q-> data; //暂存被删结点

p-> next=q->next; //摘链

delete q;

return x;

}

template <class T>

int LinkList<T>::Locate(T x)

Node<T>,p;int j;

P=first->next;j=1;

while(p && p->data!=x)

p=p->next;

j++;

if(p) return j;

else return 0;

template <class T>

void LinkList<T>::PrintList()

Node<T> *p;

p=first->next;

while (p)

cout<<p->data<<endl;

p=p ->next;

//以下为主函数

#include< iostream. h> //引用输入输出流库函数的头文件

#include”LinkList.cpp” //引用单链表类的声明和定义

void main()

int r[]={1,2,3,4,5};

LinkList<int> a(r,5);

cout< <”执行插人操作前数据为:”< < endl;

a. PrintList(); //显示链表中所有元素

try

a.Insert(2,5);

catch(char *s)

cout<<s<<endl;

cout<<”执行插人操作后数据为:”<<endl;

a. PrintList(); //显示链表中所有元素

cout<<”值为5的元素位置为:”;

cout< <a.Locate(5)<<endl; //查找元素5,并返回在单链表中位置

cout<<”执行删除操作前数据为:”<<endl;

a.PrintList(); //显示链表中所有元素

try

a.Delete(1); //删除元素4

catch(char *s)

{

cout<<s<<endl;

cout< <”执行删除操作后数据为:”< < endl;

a.PrintList(); //显示链表中所有元素

最佳答案
#include <stdio.h>
#include <stdlib.h>

typedef struct _list {
int val;
struct _list* next;
} *node, list;

node Insert( node* head, node pos, int val )
{
node tmp;
tmp = ( node )malloc( sizeof( list ) );
tmp->val = val;
tmp->next = pos ? pos->next : *head;
if ( pos ) {
pos->next = tmp;
} else {
*head = tmp;
}
return tmp;
}

node Find( node head, int n ) {
if ( !head )
return NULL;
while ( head->val != n ) {
head = head->next;
}
return head;
}

node Create( int* beg, int* end )
{
node head, t;
head = t = NULL;
while ( beg != end ) {
t = Insert( &head, t, *beg++ );
}
return head;
}

void Remove( node* head, node n )
{
node prev, next;
prev = next = *head;
while ( next != n ) {
prev = next;
next = next->next;
}
if ( prev == *head ) {
*head = next->next;
} else {
prev->next = next->next;
}
free( next );
}

void Print( node head )
{
while ( head ) {
printf( "%d ", head->val );
head = head->next;
}
putchar( '\n' );
}

void Del( node head )
{
node tmp;
while ( head ) {
tmp = head;
head = head->next;
free( tmp );
}
}

int main()
{
int a[] = { 6,1,3,9,2,8,5,0,7,4 };
node head, pos;
head = Create( a, a + 10 );
Print( head );
pos = Find( head, 2 );
Insert( &head, pos, 999 );
Remove( &head, pos->next->next );
Print( head );
Del( head );
getchar();
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
长春有没有卖2手鼠笼的?
但丁名言走自己的路,走自己的路让别人说去吧.
为什么和她聊天我会烦呢
广州市荔湾区国土资源和规划局我想知道这个在
那里有20011级高一物理试卷
教人做人和处事的书,有哪些好书?
女孩为什么喜欢哭??
诺基亚5630好用么?好不好啊。
二年级有那些歇后语,歇后语有那些
铁岭市银州区大教会陪灵会时间
小猪生病没元宝了怎么办?
大哥~拜托了,我买了TP的无线路由器,但是怎
赞美七月建军节的诗歌,判断题【今年是七月三
十五号以后开通超级QQ收费吗
坦然的面对一切是不是更好?
推荐资讯
地下城明天维护吗
姓何的女孩子取什么名字好听?
大多数男生都喜欢怎样的女生?
一般要+几的装备、和抗性多少!才可以狐歧山
实现现代化英语怎么说,请问:“近代”,“现
大益总裁吴远之为什么要搞祠善活动?普洱茶真
请问这样的QQ能卖多少钱?
太阳神叫什么,中国传说的太阳神
听说WWE UT和塞纳组合?
任性外加不稳重的男人可以改变他吗
韦达定理是什么,谁能告诉我?
求QQ仙境激活码啊?给个,谢谢
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?