对链表的相关操作及数据结构的再理解
结点的操作 由于链表是n个离散结点彼此通过指针相连,所以对链表的相关操作主要通过头指针(存放了头结点的地址)对结点进行操作来实现。
1.如何将q所指向的结点插入到p所指向结点的后面?
有两个方法
第一种: 采用临时变量
r=p->pNext;//用r保存p所指向结点的下一个结点地址
p->pNext=q;//此时p的指针域指向q所指的结点的地址
q->pNext=r;
第二种:不采用临时变量
q-pNext=p->pNext;//让p和q所指向结点的指针域指向后面的同一个结点
p-pNext=q;//再让p的指针域指向q结点
2.如何删除一个节点(思路:用一个临时变量r来保存要删除的结点,再删除p后面的那个结点)
r=p->pNext;
p->pNext=p->pNext->pNext;
free(r);
r=NULL;
3.如何判断链表是否为空(思路:空链表只有一个头结点,所以只需让头结点的指针域为NULL即可)
对链表的相关操作
实例说明:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
PNODE CreateList();//创建链表
void TraverseList(PNODE);//遍历链表
bool IsEmpty(PNODE);//判断链表是否为空
int Length(PNODE);//求链表长度
bool InsertNode(PNODE,int,int);//插入结点
bool DeleteNode(PNODE,int,int *);//删除结点
bool QueryNode(PNODE,int);//查找结点
bool ModifyNode(PNODE,int,int);//修改结点
void SortList(PNODE);//排序
int main()
{
PNODE pHead=NULL;
pHead=CreateList();//将创建链表的头指针的地址赋给pHead
if(0==Length(pHead))
{
printf("链表无有效节点,退出程序!\n");
exit(-1);
}
TraverseList(pHead);
if(InsertNode(pHead,2,100))
{
printf("插入后");
TraverseList(pHead);
}
else
{
printf("插入操作失败!\n");
}
SortList(pHead);
printf("排序后");
TraverseList(pHead);
return 0;
}
PNODE CreateList()
{
int len;//用来保存需要创建链表的结点个数
int i;
int val;//用来临时存放新节点的值
PNODE pHead=(PNODE)malloc(sizeof(NODE));//动态分配一块内存,该内存保存头结点的地址,并将其赋给pHead
PNODE pTail=pHead;
PNODE pNew;
pTail->pNext=NULL;//将尾结点的指针域赋为NULL
if(NULL==pHead)
{
printf("分配失败,程序终止运行!\n");
exit(-1);
}
printf("请输入你要创建链表的结点个数:len=");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请输入第%d个结点的值:",i+1);
scanf("%d",&val);
pNew=(PNODE)malloc(sizeof(NODE));//创建新临时结点
if(NULL==pNew)
{
printf("分配失败,程序终止运行!\n");
exit(-1);
}
pNew->data=val;
pTail->pNext=pNew;//将新结点挂到原尾结点的后面
pNew->pNext=NULL;//将新结点的指针域赋为NULL
pTail=pNew;//将新结点置为尾结点
}
return pHead;
}
void TraverseList(PNODE pHead)
{
PNODE p=pHead->pNext;//将头结点的指针域指向首结点(链表的第一个有效结点),并赋给指针变量p,此时p指向首节点的地址
printf("遍历整个链表:");
while(NULL!=p)//当p指向首节点的地址不为NULL(即链表不为空),循环输入个结点的值
{
//当p指向尾结点的地址时,可输出尾结点的值
//但此时尾结点指针域为NULL,将跳出while循环
printf("%d ",p->data);
p=p->pNext;//将p指向下一个结点的地址赋给p指针
}
printf("\n");
}
bool IsEmpty(PNODE pHead)
{
if(NULL==pHead->pNext)
return true;
else
return false;
}
int Length(PNODE pHead)
{
PNODE p=pHead->pNext;//此时p指向链表的首结点(第一个有效结点)的地址
int len=0;
while(NULL!=p)
{
++len;
p=p->pNext;
}
return len;
}
bool InsertNode(PNODE pHead,int pos,int val)
{
int i=0;
PNODE p=pHead,q;
PNODE pNew;
while(NULL!=p&&i<pos-1)//目的是为了使p指向要插入位置的前一个结点
{
p=p->pNext;
++i;//如链表只有两个有效结点,要插入的位置结点pos=3,i=2时,2<3-1不成立,循环结束,
}
if(i>pos-1||NULL==p)//p为NULL说明要插入位置结点的前一个结点不存在,i>pos-1是为了防止用户输入pos为像0、-1等非法数据
return false;
pNew=(PNODE)malloc(sizeof(NODE));//为新节点分配内存
if(NULL==pNew)
{
printf("动态内存分配失败,程序终止!\n");
exit(-1);
}
pNew->data=val;
q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
return true;
}
bool DeleteNode(PNODE pHead,int pos,int *pVal)
{
int i=0;
PNODE p=pHead,q;
while(NULL!=p->pNext&&i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL==p)
return false;
q=p->pNext;
*pVal=q->data;
p->pNext=p->pNext->pNext;
free(q);
q=NULL;
return true;
}
void SortList(PNODE pHead)
{
int i,j,t;
int len=Length(pHead);//用len来保存链表的长度
PNODE p,q;
for(i=0,p=pHead->pNext;i<len-1;p=p->pNext,i++)//比较趟数
{
for(j=i+1,q=p->pNext;j<len;q=q->pNext,j++)//比较对数
{
if(p->data>q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
}
}
}
bool QueryNode(PNODE pHead,int pos)
{
int i=0;
PNODE p=pHead,q;
while(NULL!=p->pNext&&i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL==p)
return false;
q=p->pNext;
printf("第%d号位置上结点的值为:%d\n",pos,q->data);
return true;
}
bool ModifyNode(PNODE pHead,int pos,int val)
{
int i=0;
PNODE p=pHead,q;
while(NULL!=p->pNext&&i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL==p)补充:软件开发 , C语言 ,
上一个:C语言统计字符小练习
下一个:C陷阱与缺陷代码分析之第1章词法陷阱
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊