线性表之单链表
2017-09-24 本文已影响0人
yhcheer
对比了好几本书,比较少涉及单链表的赋值,为了亲自跑出其他功能,花了不少时间,毕竟是打基础嘛,相信以后会越来熟练(你为什么那么熟练^ ^)话不多说,下面是代码及实验结果。
这里写图片描述
#include <cstdio>
#include <cstdlib>
#define ElementType int
#define MAXSIZE 1000
#define ERROR -1
/*线性表-顺序表-结构体定义*/
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next; /*最后一个位置下标,用来计算顺序表的长度*/
};
struct LNode L;
PtrToLNode PtrL = &L;
/*初始化-赋值*/
PtrToLNode CreatNewList(PtrToLNode PtrL , int data){
PtrToLNode q = PtrL;
PtrToLNode p = (PtrToLNode)malloc(sizeof(struct LNode));
p->Next = NULL;
p->Data = data;
if( NULL == PtrL ){
PtrL = p;
}
else{
while(q->Next)
q = q->Next;
q->Next = p;
}
return PtrL;
}
/*遍历-打印*/
int ShowNewList(PtrToLNode PtrL ){
PtrToLNode p = PtrL;
while(p){
printf("%d",p->Data);
p = p->Next;
}
printf("\n");
return 1;
}
/*遍历-求表长*/
int Length(PtrToLNode PtrL){
PtrToLNode p = PtrL; /*p指向表第一个节点*/
int j = 0;
while(p){
p = p->Next;
j++; /*此时p指向第j个节点*/
}
return j;
}
/* 按序查找 */
/* 查找第K个数,并返回其值的指针 */
PtrToLNode FindKth( int K, PtrToLNode PtrL )
{ PtrToLNode p = PtrL; /*p指向表第一个节点*/
int i = 1;
while( p != NULL && i < K ){
p = p->Next;
i++;
}
if ( i == K ) return p; /* 如果找到,返回指针 */
else return NULL;
}
/* 按值查找 */
/* 查找X,并返回其值位置 */
int Find( int X, PtrToLNode PtrL )
{ PtrToLNode p = PtrL; /*p指向表第一个节点*/
int j = 1;
while( p != NULL && p->Data != X ){
p = p->Next;
j++;
}
return j;
}
/* 插入 */
/* 必须知道前一个节点才能插入 */
PtrToLNode Insert( PtrToLNode PtrL, ElementType X, int i )
{
PtrToLNode p,s;
if(i == 1){ //第一个节点特殊处理
s = (PtrToLNode)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = PtrL;
return s;
}
p = FindKth(i-1,PtrL);
if(p == NULL){
printf("参数i错误");
return NULL;
}
else{
s = (PtrToLNode)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
/* 删除 */
/* 必须知道前一个节点才能删除 */
PtrToLNode Delete( PtrToLNode PtrL, int i){
PtrToLNode p,s;
if(i == 1){ //第一个节点特殊处理
s = PtrL;
if(PtrL != NULL) PtrL = PtrL->Next; //链跳过第一个节点
else return NULL;
free(s);
return PtrL;
}
p = FindKth(i-1,PtrL);
if(p == NULL){
printf("第 %d 个结点不存在",i-1); return NULL;
}
else if(p->Next == NULL){
printf("第 %d 个结点不存在",i-1); return NULL;
}
else{
s = p->Next;
p->Next = s->Next; //跳过s
free(s);
return PtrL;
}
}
void DestoryList( PtrToLNode PtrL )
{
PtrToLNode p;
if(PtrL == NULL)
return;
while(PtrL)
{
p = PtrL;
PtrL=PtrL->Next;
free(p);
}
}
int main()
{
int i,l,n,x,K,j,X;
int m,M,d;
PtrToLNode PtrL,find1,find2;
scanf("%d",&n);
for(i = 0; i < n; i++){
scanf("%d",&x);
PtrL = CreatNewList(PtrL , x);
}
l = Length(PtrL);
printf("Length = %d \n",l);
ShowNewList(PtrL);
printf("Find Kth number, input K :");
scanf("%d",&K);
find1 = FindKth( K, PtrL );
printf("Kth = %d\n",find1->Data);
printf("Find a number, input number :");
scanf("%d",&X);
j = Find( X, PtrL );
printf("%d is in the %d th position\n", X,j);
printf("insert m in M ,input m M :");
scanf("%d %d",&m,&M);
PtrL = Insert( PtrL, m, M );
ShowNewList(PtrL);
printf("delete d th number, input d :");
scanf("%d",&d);
PtrL = Delete( PtrL, d);
ShowNewList(PtrL);
DestoryList(PtrL);
return 0;
}