带头结点的单链表的创建

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

带头结点的单链表的创建、求表长、输出、插入、删除、查找、逆置

//说明在VC6.0中不能把本代码保存为.c进行编译,应保存为.cpp,原因可能是里边注释是c++的风格,在codeblocks中不存在这个问题

#include

#include

#define DataType int

#define FLAG -1

typedef struct Node

{

DataType data;

struct Node *next;

}Lnode,*LinkList;

LinkList Creat_LinkList()

{

LinkList L;

Lnode *s,*r;

int x;

printf("建立有表头结点的单链表,以%d作为创建链表完成的标志\n",FLAG);

L=r=s=NULL;

L=(Lnode *)malloc(sizeof(Lnode));

if(!L)

{

printf("表头结点开辟失败\n");

exit(-1);

}

L->next=NULL;

scanf("%d",&x);

while(x!=FLAG)

{

s=(Lnode *)malloc(sizeof(Lnode));

if(!s)

{

printf("结点开辟失败\n");

exit(-1);

}

s->data=x;

if(NULL==L->next)//第一个结点的处理

L->next=s;

else

r->next=s;

r=s;

scanf("%d",&x);

}

if(r!=NULL)//对于非空表,最后结点的指针域放空指针r->next=NULL;

return L;

}

/*有头结点的链表,求表长算法*/

int Length_LinkList(LinkList L)

{

Lnode *p;

int j;

p=L;

j=0;

while(p->next)

{

p=p->next;

j++;

}

return j;

}

int Print_LinkList(LinkList L)

{

printf("输出:\n");

Lnode *s;

s=L;

while(s->next!=NULL)

{

s=s->next;

printf("%3d",s->data);

}

printf("\n");

return 0;

}

/*逆置算法思路:

依次取原链表中每个结点,将其作为第一个结点插入到新的

链表中去。指针p用来指向原表中当前结点,p为空时结束。*/ void Reverse_LinkList(LinkList H)//单链表的逆置

{

Lnode *p,*q;

p=H->next;//p指向第一个结点

H->next=NULL;//将原链表置为空表

while(p)

{

q=p;

p=p->next;

q->next=H->next;//将当前节点插入到头结点后面

H->next=q;

}

return;

}

/*按序号查找*/

Lnode *Get_LinkList(LinkList L,int i)

{

Lnode *p;

int j=0;

p=L;

while(p->next!=NULL&&j

{

p=p->next;

j++;

}

if(j==i)

return p;

else

return NULL;

}

/*按值查找*/

Lnode *Locate_LinkList(LinkList L,DataType x)

{

Lnode *p;

p=L->next;

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

p=p->next;

return p;

}

/*插入操作,分为:前插接点、后插结点.下面的算法实现在链表的第i个位置上插入一个数值

后插结点:设p指向单链表中某结点,s指向待插入值为x的新结点,将*s插入到*p之后,操作:s->next=p->next;p->next=s;

前插接点:遇红茶结点不同德是,这种算法要先找到前驱结点*q,然后完成在*q后插入*s, 操作:q=L;while(q->next!=p)q=p->next;s->next=q->next;q->next=s;*/

int Insert_LinkList(LinkList L,int i,DataType x)

{

Lnode *p,*s;

p=Get_LinkList(L,i-1);

if(NULL==p)

{

printf("前驱结点不存在,不能插入\n");

return 0;

}

else

{

s=(Lnode *)malloc(sizeof(Lnode));

s->data=x;

s->next=p->next;

p->next=s;

return 1;

}

}

相关文档
最新文档