链表中的怎么使用指针进行链表的建立、插入、删除等处理 *** 作

链表中的怎么使用指针进行链表的建立、插入、删除等处理 *** 作,第1张

1、链表建立需要节点。这是存储数据的基础,以C++语言为例,要建立这样的节点(假设存储信息的类型作为一个模板)

template <class DataType>

struct Node{

DataType info //节点存储的信息

Node<DataType>*next

}

2、因为你是使用指针,那么,就需要动态创建结构体。使用new 运算符在堆内存中创建

Node<DataType>*head = new Node<DataType>

堆内存和栈不同,你动态申请和释放都是在堆内存里,所以你不用担心调用一个函数,在

这个函数里动态申请了内存,返回之后没有了,在的。

3、插入节点

我们以插入头结点后边为例:

假设函数原型为:

void AddToFirst( Node<DataType>* head, DataType data )

那么函数主体中这样写:

{

Node<DataType>* ptr = new Node<DataType> //动态生成一个新的节点

ptr->info = data //存储传递过来的DataType类型的数据

ptr->next = head->next //先让ptr指向的地方为head指向的地方

head->next = ptr //再让头结点指向ptr

}

这样,添加到头结点之后的动作就完成了。

4、删除 *** 作

删除 *** 作需要查找是否存在要删除的数据,存在则删除,不存在不采取动作

函数原型:

void DeleteNode ( Node<DataType>*head, DataType data )

我们设置ptr作为遍历链表的游标,设置ptrNext指针作为ptr的下一个节点,将它里面的info与data对比;

设置两个指针是为了方便我们删除节点。

函数定义如下

{

Node<DataType>*ptr = head

Node<DataType>*ptrNext = prt->next

while( ptrNext &&ptrNext->info != data ){ //当ptrNext不是NULL且包含的数据不等于data时

ptr = ptrNext

ptrNext = ptrNext->next //ptr和ptrNext均往下移动一次

}

if( ! ptrNext ) //如果ptrNext == NULL

cout <<"链表中不存在此数据:" <<data <<endl

else{//那么跳出循环的情况就只能是ptrNext->info == data啦,此处删除ptrNext

ptr->next = ptrNext->next //释放ptrNext指向的堆内存之前,要把

//ptrNext之前的节点,也就是ptr,将其指向prtNext指向的地方

delete ptrNext //释放堆内存

cout <<"删除成功!" <<endl

}

}

关于链表的建立、添加节点、删除节点,还需要你自己多多琢磨。

#include<stdlib.h>

#include<stdio.h>

/* 定义ElemType为int类型 */

typedef int ElemType

#define TRUE 1

#define FALSE 0

#define flag -1

/* 单链表的结点类型 */

typedef struct LNode

{

ElemType data

struct LNode *next

} LNode,*LinkedList

/* 初始化单链表 */

LinkedList LinkedListInit()

{

LinkedList L

L=(LinkedList)malloc(sizeof(LNode))

L->next=NULL

return L

}

/* 清空单链表 */

void LinkedListClear(LinkedList L)

{

L->next=NULL

}

/* 检查单链表是否为空 */

int LinkedListEmpty(LinkedList L)

{

if (L->next==NULL) return TRUE

else return FALSE

}

/* 遍历单链表 */

void LinkedListTraverse(LinkedList L)

{

LinkedList p

p=L->next

while (p!=NULL)

{

printf("%d ",p->data)

p=p->next

}

}

//求链表长度

int LinkedListLength (LinkedList L)

{

LinkedList p

int j

p=L->next

j=0

while (p!=NULL)

{

j++

p=p->next

}

return j

}

//

LinkedList LinkedListGet (LinkedList L, int i)

{

LinkedList p

int j

p=L->next

j=1

while (p!=NULL &&j<i )

{

p=p->next

j++

}

if (j==i) return p

else return NULL

}

LinkedList LinkedListLocate ( LinkedList L, ElemType x)

{

LinkedList p

p=L->next

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

p=p->next

return p

}

void LinkedListInsert(LinkedList L, int i, ElemType x)

{

LinkedList pre,p,s

int j

pre=L

j=1

p=L->next

while (pre&&j<i)

{

pre=p

p=p->next

j++

}

if (pre==NULL)

{

printf("给的i值超过了表长")

exit(0)

}

s=(LNode *)malloc(sizeof(LNode))

s->data=x

pre->next=s

s->next=p

}

void LinkedListDel (LinkedList L,ElemType x)

{

LinkedList pre,p

int j

pre=L

j=1

p=L->next

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

{

pre=p

p=p->next

j++

}

if (p==NULL)

{

printf("表中没有值为x的结点")

exit(0)

}

pre->next=p->next

free(p)

}

LinkedList LinkedListCreat( )

{

LinkedList L=LinkedListInit(),p,r

ElemType x

r=L

printf("please input data,input -1 is end\n")

scanf("%d",&x)

while (x!=flag)

{

p=(LinkedList)malloc(sizeof(LNode))

p->data=x

r->next=p

r=p

scanf("%d",&x)

}

r->next=NULL

return L

}

int main()

{

int quit=0

int i

ElemType e

LinkedList L

while (!quit)

{

int d

printf("please input the operation\n")

printf("1.初始化链表 2.清空链表3.求链表长度4.检查链表是否为空\n")

printf("5.遍历链表 6.从链表中查找元素\n")

printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置\n")

printf("8.向链表中插入元素9. 从链表中删除元素10.创建一个单链表\n")

printf("其他键退出。。。。。\n")

scanf("%d",&d)

switch (d)

{

case 1:

L=LinkedListInit()

break

case 2:

LinkedListClear(L)

break

case 3:

printf("链表长度为:%d\n",LinkedListLength(L))

break

case 4:

if (LinkedListEmpty(L))printf("true\n")

else printf("false\n")

break

case 5:

LinkedListTraverse(L)

break

case 6:

printf("请输入查找的位置.\n")

scanf("%d",&i)

printf("位置是: %d\n",LinkedListGet(L,i))

break

case 7:

printf("请输入数值.\n")

scanf("%d",&e)

printf("位置是: %d\n",LinkedListLocate(L,e))

break

case 8:

printf("请输入插入的位置和值.\n")

scanf("%d%d",&i,&e)

LinkedListInsert(L,i,e)

break

case 9:

printf("请输入删除的数值:\n")

scanf("%d",&e)

LinkedListDel(L,e)

break

case 10:

L=LinkedListCreat()

break

default:

quit=1

}

}

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11752437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存