当前位置:文档之家› 链表创建、插入、删除经典源程序

链表创建、插入、删除经典源程序

#include
#include
#include //getch()函数的头文件

struct Link
{
int data;
struct Link *next;
};

struct Link *head;//定义一个指向链表头的全局变量

/*********************************************
函数功能:建立一个新的节点,并为该节点赋值
函数参数:nodeNumbers为建立节点的个数;
返回值:指向该节点的指针
**********************************************/

struct Link *CreateNode(int nodeNumbers)
{
struct Link *p;
p=(struct Link *)malloc(sizeof(struct Link));
if(p==NULL)
{
printf("No enough memory to alloc");
exit(0);
}
p->next=NULL; //任何一个新建的节点指针域都应赋为空指针
p->data=nodeNumbers*10;

printf("\nCreate a new data!");
return p;
}
/*********************************************************
函数功能:在链表中插入一个节点
函数参数:结构体指针变量head,表示指向链表头指针
整形变量tData,表示插入节点的数据区内容
返回参数:指向链表头指针
**********************************************************/
struct Link *InsertNode(struct Link *head,int tData)
{
struct Link *pr,*p;
p=(struct Link *)malloc(sizeof(struct Link));
if(p==NULL)
{
printf("can't enough memory to alloc");
exit(0);
}
pr=head;
p->next=NULL;
p->data=tData;

if(head==NULL)
{
head=p;
}
else
{
while((pr->data < tData*10) && (pr->next!=NULL))
{
pr=pr->next;
}
if(pr==head)
{
p->next=head;
head=p;
return head;
}
if(pr->next==NULL)
{
pr->next=p;
}
else
{
p->next=pr->next;
pr->next=p;
}
}
return head;
}
/***************************************************************
函数功能:从链表中删除一个含有数据成员num的节点
函数参数:结构体指针变量head,表示指向链表头指针
长整形变量num,表示需要查找的节点中包含的数据成员的值
返回参数:指向链表头指针
*****************************************************************/
struct Link *DelNode(struct Link *head,long num)
{
struct Link *p,*pr;
if(head==NULL)
{
printf("\n No Linked Table");
return(head);
}
p=head;
while((num!=p->data)&&(p->next!=NULL))
{
pr=p;
p=p->next;
}
if(num==p->data)
{
if(p==head)
head=p->next;
else
pr->next=p->next;
free(p);
printf("delete the node");
}
else
{
printf("\nNot found the node");
}
return head;
}

/******************************************************
函数功能:显示所有已经建立好的节点号和节点中数据的内容
函数参数:结构体指针变量head,表示指向链表的头指针
函数返回值:无
*******************************************************/
void DispLink(struct Link *head)
{
struct Link *p;
int j=1;

if(head==NULL)
{
printf("\n No Table to display\n");
exit(0);
}


p=head;
do
{
printf("\n%5d%10d\n",j,p->data);
p=p->next;
j++;
}while(p!=NULL);
}
/*******************************************************************************************
主函数
函数功能:当输入'i'时,向链表中插入一个节点
当输入'q'时,退出while(1)循环,并调用插入节点函数、删除节点函数和显示节点数值函数
*********************************************************************************************/
main()
{int i=0;
struct Link *pr;//pr充当一个中间变量,用于指针之间的变换
char c;

head=NULL;
while(1)
{
printf("\n Please press 'i' to insert one new node\n");

/*注意此处用的是getch(),不是getchar();getch()函数在击键后立即返回,
无需输入回车键,且不向屏幕回显键入的字符;另外,getch()需要头文件conio.h,getchar头文件为stdio.h*/
c=getch();

if((c!='i')&&(c!='q'))
continue;
if(c=='q')
break;


if(i==0)
{
//在head中保留该节点首地址,因为下面DispLink函数要一head作为参数
head=CreateNode(i);
pr=head;
}
else
{
pr->next=CreateNode(i);
pr=pr->next;
}
i++;

}

InsertNode(head,2);//在大于20的节点后插入一个节点

DelNode(head,20);

DispLink(head);
}

相关主题
文本预览
相关文档 最新文档