前言
采用表头/表尾插入结点的方法构造单链表,掌握链式存储结构中各种函数的基本使用。
程序要求
编写程序,实现单链表(带头结点)的基本操作:
(1) 表尾插入结点构造指定长度的单链表;
(2) 在指定位置前插入新的元素;
(3) 删除指定元素。
程序代码
删除指定元素那里我定义成了删除元素的所在位置。
#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
/**
**链表节点的定义
*/
typedef struct Node{
int data;//数据域
struct Node * PNext;//指针域,存放下一个节点的地址
} Node ,* PNode ;
/**
**创建链表
*/
PNode create_list()
{
int len,i;
printf("请输入链表的长度:\n");
scanf("%d",&len);
PNode PHead=malloc(sizeof(Node));
PHead->PNext=NULL;
PNode PTail=PHead;//PTail是永远指向尾节点的指针
for(i=0;i<len;i++)
{
int val;
printf("请输入第 %d 个元素的值:", i+1);
scanf("%d",&val);
PNode PNew=malloc(sizeof(Node));
PNew->data=val;
PNew->PNext=NULL;
PTail->PNext=PNew;
PTail=PNew;
}
return PHead;
}
/**
**对链表进行遍历
*/
void traverse(PNode pHead)
{
PNode p=pHead->PNext;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->PNext;
}
printf("\n");
}
/**
*判断链表是否为空
*/
bool checklist(PNode pHead)
{
if(NULL==pHead->PNext)
{
return true;
}else{
return false;
}
}
/**
**获取链表的长度
*/
int list_num (PNode pHead)
{
int num=0;
PNode p=pHead->PNext;
while(p!=NULL)
{
num++;
p=p->PNext;
}
return num;
}
/**
*向链表中插入元素
*/
bool insert_list(PNode pHead,int val ,int pos){
//需要找到第pos个位置,并且需要判断这个位置pos是否合法
//i是p所指节点的位置,所以从一开始pos-1,当i=pos-1时跳出循环
int i=0;
PNode p=pHead;
while(NULL!=p&&i<pos-1)
{
i++;
p=p->PNext;
}
//如果插入位置过大,那么P=NULL,
//如果插入的位置是0或者负数,那么i>pos-1
if(i>pos-1||NULL==p)
{
printf("插入位置不合法\n");
return false;
}
PNode PNew=malloc(sizeof(PNode));
PNew->data=val;
PNode temp=p->PNext;
p->PNext=PNew;
PNew->PNext=temp;
return true;
}
/**
**在链表中删除节点
*/
delete (PNode PHead,int pos)
{
int i=0;
PNode p=PHead;
//我们要删除p后面的节点,所以p不能指向最后一个节点 p->next!=NULL
while(p->PNext!=NULL&&i<pos-1){
p=p->PNext;
i++;
}
if(i>pos-1||p->PNext==NULL)
{
printf("删除位置不合法\n");
return false;
}
PNode temp=p->PNext;
p->PNext=temp->PNext;
free(temp);
}
int main()
{
int n,p,q;
PNode PHead=create_list();
if(checklist(PHead))
{
printf("链表为空\n");
}
printf("\n遍历元素为:\n");
traverse(PHead);
printf("\n注意:所定义的单链表最大长度为:%d\n",list_num(PHead));
printf("输入要插入的数据:");
scanf("%d",&n);
printf("输入要插入的位置:");
scanf("%d",&p);
insert_list(PHead,n,p);
printf("插入后的元素为:\n");
traverse(PHead);
printf("输入要删除的元素位置:");
scanf("%d",&q);
delete(PHead,q);
traverse(PHead);
return 0;
}