今天,主要实现对单链表的相关操作,包括在链表中插入元素、实现对链表节点的反序排列和在链表中删除节点。
相关程序代码如下,
#define FALSE 0
#define TRUE 1
//定义单链表节点结构体
typedef struct NODE1
{
struct NODE1 *link;
int value;
}node;
//在单链表中插入元素
int sll_insert(register node **linkp,int value)
{
register node *current; //定义指向当前节点的指针
register node *New; //定义要插入的指针
while((current=*linkp)!=NULL&¤t->value<value)
{
linkp=¤t->link; //linkp指向下一个节点
}
//为新的节点分配内存
New=(node *)malloc(sizeof(node));
if(New==NULL)
{
return FALSE;
}
New->value=value;
//将新的节点插入链表
New->link=current;
*linkp=New;
return TRUE;
}
//实现对单链表节点的反向排列
//first:指向链表的第一个节点
struct NODE1 * sll_reverse(struct NODE1 *first)
{
node *next;
node *current;
node *temp;
//判断是否为空链表
if(first==NULL)
{
return NULL;
}
current=first;
next=current->link;
for(temp=current;next!=NULL;next=current->link)
{
if(current==first)
{
current->link=NULL;
temp=current;
current=next;
}
else
{
current->link=temp;
temp=current;
current=next;
}
}
current->link=temp;
return current;
}
//从一个单链表中删除一个节点
//rootp是指向链表根指针的指针
int sll_remove(struct NODE1 **rootp,struct NODE1 *nod)
{
node *current;
node *temp;
current=*rootp; //指向第一个节点
for(;current!=NULL;temp=current,current=current->link) //temp保存要删除的节点前的一个节点的信息
{
if(current->value==nod->value)
{
break; //找到需要删除的节点
}
}
if(current==NULL)
return FALSE;
temp->link=current->link;
current->link=NULL;
return TRUE;
}
int main(void)
{
node *newnode,*Newnode;
node *rootp;
newnode=(node *)malloc(sizeof(node));
if(newnode==NULL)
{
return 0;
}
rootp=newnode;
newnode->value=1;
newnode->link=NULL;
sll_insert(&rootp,2);
sll_insert(&rootp,3);
sll_insert(&rootp,4);
sll_insert(&rootp,5);
sll_insert(&rootp,6);
Newnode=sll_reverse(newnode);
sll_remove(&Newnode,Newnode->link); //删除了5
printf("%d\n",Newnode->value);
system("pause");
}