/*单链表的练习-头插法*/
/*单链表由头结点就可以唯一确定*/
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
//定义单链表结构
typedef struct Node{
int data; //数据域
Node * pNext; //指针域
}NODE,* PNODE;
PNODE create_list(void); //创建链表
void show_list(PNODE pHead); //显示链表
void insert(PNODE pHead,int pos,int inval); //向链表中某个位置插入元素
int deleteList(PNODE pHead,int pos); //删除链表某个位置上的值
void find(PNODE pHead,int fval); //在链表中查找某个元素
void main(){
PNODE pHead = NULL; //定义一个头结点,初始值为空
pHead = create_list();
show_list(pHead);
insert(pHead,2,100);
show_list(pHead);
find(pHead,3);
printf("你所删除的值是%d\n",deleteList(pHead,2));
show_list(pHead);
}
PNODE create_list(void){
int length,val;
PNODE pHead = (PNODE)malloc(sizeof(NODE)); //向内存申请头节点空间
pHead->pNext=NULL; //开始的时候只有头结点自身,没有其它结点
if(NULL == pHead){
printf("分配失败,程序终止");
exit(-1);
}
printf("请输入需要生成的单链表的长度:");
scanf("%d",&length);
for(int i=0;i<length;i++){ //for循环生成指定个数的结点
printf("请输入第%d个节点的值: ",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew){
printf("分配失败,程序终止");
exit(-1);
}
pNew->data=val; //给新申请的结点数据域赋值
pNew->pNext=pHead->pNext; //头指针指向的下一个结点的地址赋给了新结点的指针域,也就是在当前头结点后面直接插入一个新结点
pHead->pNext=pNew; //头结点指向了新的结点
}
return pHead; //函数返回头结点的地址
}
void show_list(PNODE pHead){
printf("单链表的值如下:\n");
PNODE P = pHead->pNext;
while(P != NULL){ //while巡检打印出所以结点,直到下个结点不存在
printf("%d ",P->data);
P=P->pNext;
}
printf("\n");
}
void insert(PNODE pHead,int pos,int inval){
PNODE P = pHead;
int j=0;
while(P != NULL && j<pos-1){ //如果结点不为空,把P指针移动到插入位置的前一个结点位置
P = P->pNext;
j++;
}
if(P == NULL){
printf("插入失败\n");
exit(-1);
}else{
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //申请新的结点
pNew->data=inval; //将要插入的值赋值给新结点的数据域
pNew->pNext=P->pNext; //新结点指向P指针指向的下一个结点
P->pNext=pNew; //P指针所在的结点指向新结点
printf("你已经成功的插入了元素%d到链表中.\n",inval);
}
}
int deleteList(PNODE pHead,int pos){
PNODE P = pHead,S;
int j=0,x;
if(P != NULL && j<pos-1){
P = P->pNext;
j++;
}
if(P == NULL){
printf("删除失败,数组是空的");
exit(-1);
}else{
S = P->pNext;
P->pNext = S->pNext;
x = S->data;
free(S);
return x;
}
}
void find(PNODE pHead,int fval){
PNODE P = pHead;
int cnt=0;
if(P == NULL){
printf("不用找了,链表是空的\n");
exit(-1);
}
while(P != NULL){
P = P->pNext;
++cnt;
if(P->data==fval){
printf("你要找的数%d在链表中,它在链表的第%d个位置\n",fval,cnt);
break;
}
}
}
结果截图
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。