C单链表实现,有什么问题可以留言讨论

先发个代码试试水

刚开始学的

/*这个程序是用来练习单链表的*/

#include

iostream

#include

stdio.h

#include

ctime

const

int

TRUE

=

1

;

const

int

FALSE

=

;

const

int

MAXSIZE

=

10

;

using

namespace

std

;

//定义链表中存储的数据类型

typedef

int

Elemtype

;

//定义函数返回值的数据类型

typedef

Elemtype

Status

;

//定义单链表结构

typedef

struct

Node

{

Elemtype

data

;

Node

*

next

;

//这个指针指向Node数据类型的存储地址

}

Node

;

//给Node数据类型起名字,可以改成其他名字

typedef

struct

Node

*

LinkList

;

/*定义一个指向链表的指针,这里的链表就是Node节点一个个组成的*/

Status

GetElem

(

LinkList

L

,

int

i

,

Elemtype

*

e

);

/*获取链表中的元素*/

void

ShowList

(

LinkList

L

);

/*展示链表的内容*/

void

CreateListHead

(

LinkList

L

,

int

n

);

//头插法创建单链表

Status

ListInsert

(

LinkList

L

,

int

i

,

Elemtype

e

);

/*用来向链表内插入元素*/

Status

ListDelete

(

LinkList

L

,

int

i

);

/*用来删除链表中指定下表的节点*/

int

main

(

void

){

LinkList

L1

;

CreateListHead

(

L1

,

MAXSIZE

);

ShowList

(

L1

);

cout

"

\n

请输入要读取的元素序号(1-?):

\n

"

;

int

index

;

cin

index

;

Elemtype

*

e

;

e

=(

Elemtype

*)

malloc

(

sizeof

(

Elemtype

));

Status

elem

;

elem

=

GetElem

(

L1

,

index

,

e

);

cout

"结果为:

\n

"

elem

;

cout

"

\n

请输入要插入元素的位置(1-?):

\n

"

;

cin

index

;

cout

"请输入要插入的整数:

\n

"

;

cin

(*

e

);

ListInsert

(

L1

,

index

,(*

e

));

free

(

e

);

ShowList

(

L1

);

cout

"

\n

请输入要删除的节点序号(1-?):

\n

"

;

cin

index

;

ListDelete

(

L1

,

index

);

ShowList

(

L1

);

return

;

}

Status

GetElem

(

LinkList

L

,

int

i

,

Elemtype

*

e

){

LinkList

p

;

//这个指针用来迭代

if

(

i

=

){

cout

"所给序号=0

\n

"

;

return

FALSE

;

}

if

(

L

-

next

==

NULL

){

cout

"链表为空

\n

"

;

return

FALSE

;

}

p

=

L

-

next

;

//让p指向链表的第一个节点

for

(

int

k

=

1

;

k

i

;

k

++)

{

if

(

p

-

next

==

NULL

){

cout

"所给的序号超出链表范围!!

\n

"

;

return

FALSE

;

}

p

=

p

-

next

;

//指向的节点往后移

}

return

p

-

data

;

//返回当前指向的节点数据

}

void

ShowList

(

LinkList

L

){

LinkList

p

;

p

=

L

;

cout

"链表的内容为:

\n

"

;

while

(

p

-

next

!=

NULL

){

cout

p

-

next

-

data

""

;

p

=

p

-

next

;

}

}

void

CreateListHead

(

LinkList

L

,

int

n

){

LinkList

p

;

srand

(

time

(

));

/*初始化随机数种子*/

L

=

new

Node

;

L

-

next

=

NULL

;

/*先建立一个带头结点的单链表*/

for

(

int

i

=

;

i

n

;

i

++)

{

p

=

new

Node

;

/*生成新的节点*/

p

-

data

=

rand

()%

+

1

;

p

-

next

=

L

-

next

;

/*将原有的节点往后移*/

L

-

next

=

p

;

/*插入到表头*/

}

}

Status

ListInsert

(

LinkList

L

,

int

i

,

Elemtype

e

){

if

(

i

=

){

printf

(

"序号超出链表范围"

);

cout

"插入失败!!

\n

"

;

return

FALSE

;

}

LinkList

p

;

p

=

L

;

int

k

=

1

;

LinkList

node

=(

LinkList

)

malloc

(

sizeof

(

Node

));

node

-

data

=

e

;

while

(

p

-

next

!=

NULL

){

if

(

k

=

i

){

break

;

}

p

=

p

-

next

;

//指针向后移动

k

++;

}

if

(

k

=

i

){

//说明要插入到最后一个位置

p

-

next

=

node

;

node

-

next

=

NULL

;

cout

"插入成功

\n

"

;

return

TRUE

;

}

//要插入元素到中间位置

node

-

next

=

p

-

next

-

next

;

p

-

next

=

node

;

cout

"插入成功

\n

"

;

return

TRUE

;

}

Status

ListDelete

(

LinkList

L

,

int

i

){

LinkList

p

,

q

;

p

=

L

;

//让p指针指向链表的头节点

int

k

=

1

;

while

(

p

-

next

!=

NULL

){

if

(

k

=

i

){

break

;

}

p

=

p

-

next

;

//p指针向后移动到要删除节点的上一个节点

k

++;

}

if

(

k

i

){

cout

"输入下标超出链表范围!!!

\n

"

;

return

FALSE

;

}

if

(

p

-

next

-

next

!=

NULL

){

//说明要删除的是中间节点

q

=

p

-

next

;

p

-

next

=

p

-

next

-

next

;

free

(

q

);

cout

"删除成功

\n

"

;

return

TRUE

;

}

//说明要删除的是尾部节点

q

=

p

-

next

;

p

-

next

=

NULL

;

free

(

q

);

//释放删除节点的内存

cout

"删除成功

\n

"

;

return

TRUE

;

}




转载请注明:http://www.aierlanlan.com/cyrz/5976.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了