//vs2005
#include "stdafx.h"
#include <iostream>
typedef struct node
{
int data;
struct node *next;
}LNode,*LinkList;
/*创建链表:创建一个有头结点的链表,头结点不存放数据,数据从第二个结点(表头结点)开始存放。
有没有头结点链表的插入、删除、打印等操作会不同,有头结点通常操作起来更方便,例如可以方便的支持
只有一个节点的链表删除结点。
同时注意,对链表的操作中,插入和删除令p1=head,逆置令p1=head->next
前者有利于遍历
*/
LinkList creat()
{
LinkList head,p,s;
int x,flag=1;
head=(LinkList)malloc(sizeof(LNode));//头指针
p=head;
printf("输入若干整数并以空格隔开,以回车结束:\n");
char ch=' ';
while(ch!='\n')
{
scanf("%d",&x);
ch=getchar();//getchar要放在scanf后面
if(flag)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
//printf("%d",s->data);
//printf("\n");
p->next=s;//输入的第一个数作为第二个结点(表头结点)
p=s;
}
else flag=0;
}
p->next=NULL;
printf("创建成功:\n");
return head;
}
/*
删除节点:两种情况
(1)删除第i个结点,直接删除即可
(2)删除值为num的结点,要遍历整个链表,找出所有值为num的结点,全部删除
下面的代码考虑较复杂的第二种情况(也可以使用递归实现)
*/
LinkList del(LinkList head,int num)
{
LinkList p1,p2;
p1=head;
while(p1->next!=NULL)
{
if(num!=p1->next->data)
{
p1=p1->next;
}
else
{
p2=p1->next;
p1->next=p1->next->next;
free(p2);
}
}
return head;
}
//逆置单链表
LinkList reverse(LinkList head)
{
LinkList p1,p2,p3;
//p1=head;
p1=head->next;
if(p1==NULL)return head;
if(p1->next!=NULL)
{
p2=p1->next;
p1->next=NULL;
while(p2->next!=NULL)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
p2->next=p1;
head->next=p2;
}
printf("逆置成功:\n");
return head;
}
/*插入操作,常见的操作有:
(1)插入到指定位置
(2)插入到有序链表中,插入后仍然保持有序
*/
LinkList insert(LinkList head)
{
LinkList p0,p1,p2;
int num;
p1=head;
p0=(LinkList)malloc(sizeof(LNode));
printf("请输入一个要插入的整数并回车:\n");
char ch=' ';
while(ch!='\n')
{
scanf("%d",&num);
ch=getchar();
}
p0->data=num;
if(head->next==NULL)
{
head->next=p0;
p0->next=NULL;
return head;
}
while(p1->next!=NULL&&p0->data>p1->next->data)
p1=p1->next;
if(p1->next==NULL)
{
p1->next=p0;
p0->next=NULL;
}
else if(p0->data<=p1->next->data)
{
p0->next=p1->next;
p1->next=p0;
}
printf("插入成功:\n");
return head;
}
//打印链表
void print(LinkList head)
{
LinkList p;
if(head->next!=NULL)
{
p=head->next;
while(p->next!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("%d",p->data);
}
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
LinkList p;
p=creat();
print(p);
int num;
printf("你要删除哪个元素,请输入:\n");
scanf("%d",&num);
p=del(p,num);
print(p);
p=insert(p);
print(p);
p=reverse(p);
print(p);
return 0;
}
单链表基本操作
最新推荐文章于 2024-09-21 21:51:42 发布