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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)