链表的创建,插入,删除,输出基本操作
2018-12-04 07:13:59来源:博客园 阅读 ()
#include<cstdlib>
struct student //定义一个学生结点,结点包括值域和指针域
{
int num;//学号
char name[20];//姓名
char address[20];//地址
struct student *next;//定义结点的指针域,指向下一个结点
};
typedef struct student LIST;
LIST *CreateList();
LIST *InsertNode(LIST *h,LIST *s);
LIST *DeleteNode(LIST *h,long no);
void Display(LIST *h);
{
LIST *head,*p;//定义指向结点的指针
long no;//定义学号变量
head=CreateList();//调用CreateList函数创建链表
printf("学号 姓名 地址\n");
Display(head);
printf("输入要插入的结点\n");
p=(LIST *)malloc(sizeof(LIST));//动态的生成一个结点
scanf("%d %s %s",&p->num,&p->name,&p->address);
head=InsertNode(head,p);
printf("学号 姓名 地址\n");
Display(head);
printf("请输入删除结点的学号:\n");
scanf("%d",&no);
head=DeleteNode(head,no);
if(head!=NULL)
{
printf("学号 姓名 地址\n");
Display(head);
}
return 0;
}
LIST *CreateList()
{
LIST *head,*pre,*cur;
int i,n;
head=NULL;
printf("输入结点的个数:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
cur=(LIST *)malloc(sizeof(LIST));
cur->next=NULL;
if(head==NULL)//表示处理当前第一个结点
head=cur;
else
pre->next=cur;
scanf("%d %s %s",&cur->num,&cur->name,&cur->address);
pre=cur;
}
return head;
}
LIST *InsertNode(LIST *h,LIST *s)
{
LIST *pre,*p;
p=h;
if(h==NULL)
{
h=s;
s->next=NULL;
}
else
{
while(s->num>p->num&&p->next!=NULL)//在链表中找到要插入的位置
{
pre=p;
p=p->next;
}
if(s->num<=p->num)
{
if(h==p)//若插入的结点在第一个结点之前
{
h=s;
s->next=p;
}
else//若插入的结点在中间位置
{
s->next=p->next;
p->next=s;
}
}
else
{
p->next=s;
s->next=NULL;
}
}
return h;
}
/*链表结点的元素删除*/
LIST *DeleteNode(LIST *h,long no)
{
LIST *q;
LIST *pre;
q=h;
if(q==NULL)
{
printf("链表为空,不能删除结点\n");
return NULL;
}
while(q->num!=no&&q!=NULL)//查找带删结点,并保存其上一个结点
{
pre=q;
q=q->next;
}
if(q->num==no)
{
if(q==h)
{
h=h->next;
}
else
{
pre->next=q->next;
free(q);
printf("该结点被删除成功!");
}
}
else
{
printf("在链表中无法找到该学号,删除失败!");
}
return h;
}
void Display(LIST *h)
{
LIST *q;
q=h;
while(q!=NULL)
{
printf("学号:%d 姓名:%s 地址:%s\n",q->num,q->name,q->address);
q=q->next;
}
}
链表主要通过指针进行访问,因此,他的地址不是连续的。因此,
链表的创建:(此处采用尾插法,并且链表元素有序)
1、定义四个指针*h,*rear,*cur,*p;分别代表头指针,尾指针(指向
2、将头指针指向NULL(此处为了统一所有操作,链表都带有头
3、为全新的链表添加结点,由于是动态的,创建一个结点先要
1)申请一个结点并初始化
cur=(LIST *)malloc(sizeof(LIST));
cur->next=NULL;
scanf("%d %s %s",&cur->num,&cur->name,&cur->address);//此步根据结点的定义来决定
2)插入链表
当链表为空时
if(h==NULL)
h=cur;
当链表不空时,通过某一参值比较,知道插入的位置(此处以num为参值)
while(p->num<cur->num&&p!=NULL)
p=p->next;
if(p==h)//当插入位置为第一个结点时
{
cur->next=h->next;
h=cur;
}
else if(p->next==NULL)//当插入位置为最后一个结点之后
{
p->next=cur;
cur->next=NULL;//可不要
}
else//当插入位置在中间时
{
cur->next=p->next;
p->next=cur;
}
插入完成,返回链表return h;
查找与删除,根据删除的参值进行查找删除元素前一个元素的位置(此处参值为num,前一元素指针*pre)
1)如果链表为空,则查找失败,输出提示信息
if(h==NULL)
printf("链表为空,查找失败!\n")
else
{
while(p->num!=no&&p!=NULL)//查找待删元素及其前一个结点的位置
{
pre=p;
p=p->next;
}
if(p->num==no)
{
if(p==h)//当待删结点为第一个结点
h=pre->next;
else
pre->next=p->next;
}
else
printf("链表中不存在这个结点,删除失败!\n");
}
return h;
while(q!=NULL)
{
printf("学号:%d 姓名:%s 地址:%s\n",q->num,q->name,q->address);
q=q->next;
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- leetcode 反转链表 2020-06-06
- C++ 析构函数 2020-06-03
- 数据结构—链表 2020-05-29
- STL之list 2020-04-30
- 单链表 2020-03-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash