本段代码为我在看传智视频时根据老师讲的内容敲完了,事后陆陆续续自己敲了几次,最近很久没看 昨天晚上竟然在创建链表时就遇上了问题 故记录于此
#include<stdio.h>
typedef struct Node
{
int data;
struct Node *next;
}Slist;
//链表的创建 需三个辅助指针变量
Slist *Slistcreate()
{
Slist *pHead,*pm,*pcur;
int a;
pHead=(Slist*)malloc(sizeof(Slist));
if(pHead==NULL)
return NULL;
pHead->data=0;
pHead->next=NULL;
printf("Pleasr input:\n");
scanf("%d",&a);
pcur=pHead;
while(a!=-1)
{
pm=(Slist*)malloc(sizeof(Slist));
if(pm==NULL)
return NULL;
pm->data=a;
pm->next=NULL;
pcur->next=pm;
pcur=pm;
printf("Pleasr input:\n");
scanf("%d",&a);
}
return pHead;
}
//打印链表 需1个辅助指针变量
void Slistprint(Slist *pHead)
{
Slist *tmp=pHead->next;//*tmp=pHead
if(pHead==NULL)
return ;
printf("begin\n");
while(tmp!=NULL)//t,tmp->next!=NULL
{
printf("%d\n",tmp->data);
tmp=tmp->next;
}
}
//插入链表 需三个辅助指针变量
void Slist_Insert(Slist *pHead,int x,int y)
{
Slist *pPre=pHead;
Slist *pcur=pHead->next;
Slist *pm;
pm=(Slist*)malloc(sizeof(Slist));//pm的数据域记录需查找的值
if(pm==NULL)
return ;
pm->next=NULL;
pm->data=x;
//while(pcur->next!=NULL)//(pcur)
while(pcur)
{
if(pcur->data==y)
{break;}
pPre=pcur;
pcur=pcur->next;
}
pm->next=pPre->next;
pPre->next=pm;
return ;
}
//删除一个节点 相对简单
void Slist_de(Slist *pHead,int y)
{
Slist *pm;
//pm=(Slist*)malloc(sizeof(Slist));
// if(pm==NULL)
//return ;
Slist *pre=pHead;
Slist *pcur=pHead->next;
//pm->next=NULL;
// pm->data=y;
while(pcur!=NULL)
{
if(pcur->data==y)
break;
pre=pcur;
pcur=pcur->next;
}
if(pcur==NULL)
{
printf("NO\n");
return ;
}
pre->next=pre->next->next;
}
//避免野指针问题
void Slist_destroy(Slist *pHead)
{
if(pHead==NULL)
return ;
while(pHead!=NULL)
{
Slist *tmp=pHead;
free(pHead);
pHead=tmp->next;
}
}
//链表逆置 重点理解
void inverse(Slist *pHead)
{
Slist *p=NULL,*q=NULL,*t=NULL;
p=pHead;
q=pHead->next;
if(pHead==NULL||pHead->next==NULL||pHead->next->next==NULL)
return ;
while(q)
{
t=q->next;
q->next=p;
p=q;
q=t;
}
pHead->next->next=NULL;//头节点变成尾部节点 并使其指针域为NULL
pHead->next=p;
}
void main()
{
Slist *pHead=NULL;
pHead=Slistcreate();
Slist_Insert(pHead,19,20);
// Slist_de(pHead,19);
// inverse(pHead);
// Slistprint(pHead);
// Slist_destroy(pHead);
}
注意创建链表的函数可以用二级指针做函数参数直接给phead赋值,也可以采用如上代码所写将堆区创建的首地址通过函数返回值丢出来。