1.链表创建
分配空间
double*=ptd;
ptd=(double*)malloc(30*sizeof(double));//这段代码请求30个double类型值的空间,并把ptd指向该空间所在位置
typedef struct Node { int data;//数据域 struct Node * pNext;//指针域 } NODE,*PNODE;NODE等价于struct Node;PNODE等价于struct Node* PNODE creat_list(void)//创建链表不需要返回变量,故不设形参 { int len;//创建链表有效节点的个数 int i;//下标变量 int val;//用来临时存放用户输入的值 PNODE pHead=(PNODE)malloc(sizeof(NODE)); 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); PNODE pNew=(PNODE)malloc(sizeof(NODE); PNODE pTail=pHead; pHead->pNext=NULL; if(NULL==pNew) { printf("空间分配失败,程序终止!\n"); exit(-1); } pNew->data=val;//挂,在新节点存放输入值 pTail->pNext=pNew;//将新节点挂在旧节点后边 pNew->pNext=NULL;//新节点指针域指向NULL pTail=pNew;//因为旧指针存放了数值,将尾指针指向最后一位有效值 } return pHead; }
2.链表遍历
链表遍历不需要返回值 void traverse_list(PNODE pHead),变量用到指针,用一个变量可以索引全部链表,头结点
void traverse_list(PNODE pHead) { PNODE p=pHead->pNext;//因为要在头节点后,给每个节点赋值;头节点的指针域,指向第一个节点的指针(地址) while(NULL!=pHead)//判断他不为空的时候,操作;最后一个节点指针域为空,停止 { printf(%d,p->data);//打印,节点数据域中的数据 p=p->pNext;//下一个节点的指针域。不连续,不能用p++ printf("/n"); } return; }
3.链表比较
比较不需要返回值
冒泡法变量需要三个
void sort_list(PNODE pHead)//pHead存储创建链表的头结点地址 { int i, j, t; for(i>0;i<len-1;i++)//顺序比较法 { for(j>i+1;i<len;j++) if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } }
4.判断链表是否为空
判断头指针指针域,即pHead->pNext是否为空
bool is_empty(PNODE pHead)//bool返回true,false { if(pHead->pNext==NULL) return true; else return false; }
5.求链表长度
调用的函数返回定义的形参
int lenth_list(PNODE pHead)//遍历链表和数组一样,用++就行 { int len=0; PNODE p=pHead->pNext; while(NULL!=p) { len++; p=p->pNext; } return len; }
6.链表插入
需要返回值,用bool
在int pos位置插入数值:
1.链表要能够确定位置,第二个被插入数值要以链表形式被接起来
bool insert_list(PNODE pHead,int pos,int val) { int i=0; PNODE p=pHead;//指向头节点的指针 while(NULL!=p&&i<pos-1)//索引链表,将链表中有效数字序列与pos的大小相比较,当p为空的时候跳出循环,当i=pos时跳出循环,即找到pos { p=p->pNext; ++i; } if(i>pos-1||NULL==p)//插入位置超出范围或者被插入链表为空,报错 return false; PNODE pNew=(PNODE)malloc(sizeof(NODE)); if(NULL==pNew)//判断生成链表是否为空 { printf("动态分配内存失败,程序终止!"); } pNew->data=val; PNODE q=p->pNext; p->pNext=pNew; pNew->pNext=q; return true; }
7.链表删除
索引到链表中pos那个位置,然后后一位依次覆盖前一位
bool delete_list(PNODE pHead,int pos,int* pval) { int i=0; PNODE p=pHead; while(p!=NULL&&i<pos-1) { p=p->pNext; ++i; } if(i>pos-1||NULL==P) { printf("从动态内存分配失败!"); } PNODE q=p->pNext; *pval=q->data;//返回被删除的数值 p->pNext=p->pNext->pNext; free(q);//释放q申请的空间 q=NULL; }