#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Node{
int data;
struct Node * pNext;
}NODE,*PNODE;//相当于struct Node NODE,struct Node *PNODE;
//函数声明
PNODE create_list(void);//创建链表
void traverse_list(PNODE pHead);//打印链表
bool is_empty(PNODE pHead);//判断链表是否为空
int length_list(PNODE pHead);//返回链表的长度
void sort_list(PNODE pHead);//对链表进行排序
bool insert_list(PNODE,int,int);//在链表的一个位置山插入一个数据
bool insert_list2(PNODE pHead,int pos,int val);
bool delete_list(PNODE pHead,int pos,int *pVal);//删除pos位置上的节点,删除的节点的值通过pVal指针带回
int main(){
PNODE pHead = NULL;
pHead = create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
traverse_list(pHead);//打印链表
//printf("链表的长度为:%d\n",length_list(pHead));
sort_list(pHead);//对链表进行排序
traverse_list(pHead);//打印链表
if(insert_list2(pHead,1,21)){//在链表3的位置上出入一个节点,节点的数据是10
printf("插入成功\n");
}else {
printf("插入失败\n");
}
traverse_list(pHead);//打印链表
int pVal;
if(delete_list(pHead,4,&pVal)){
printf("删除成功,删除的值为%d\n",pVal);
}else{
printf("删除失败\n");
}
traverse_list(pHead);
return 0;
}
bool delete_list(PNODE pHead,int pos,int *pVal){
int i=0;
PNODE p = pHead;
while(p->pNext!=NULL&&i<pos-1){
p=p->pNext;
i++;
}
if(i>pos-1||p->pNext==NULL){
return false;
}
PNODE q=p->pNext;//q为pos位置的节点,p为pos位置的前一个节点
*pVal=q->data;//将要删除节点的值 赋给pVal所指向的变量
p->pNext=q->pNext;
free(q);
//free一个指针后要将指针置为null,free只是释放了指针所指向的内存空间,但是指针变量本身原来的值还存在
q=NULL;
return true;
}
//在pHead所指向链表的第pos节点的前面插入一个新的节点,给节点的值是val,假定pos的值从1开始
bool insert_list(PNODE pHead,int pos,int val){
PNODE p,q;//p是要插入的节点,q是要插入节点的前一个节点
int i;
p=(PNODE)malloc(sizeof(NODE));
q=pHead;
if(p==NULL||pos<1||pos>length_list(pHead)){
return false;
}
for(i=1;i<pos;i++){
q=q->pNext;
}
p->data=val;
p->pNext=q->pNext;
q->pNext = p;
return true;
}
//郝斌老师插入算法(不需要对链表求长度)
bool insert_list2(PNODE pHead,int pos,int val){
int i=0;
PNODE p = pHead;
while(p!=NULL && i<pos-1){
p=p->pNext;
i++;
}
if(i>pos-1||p==NULL){//i>pos-1是排除0和负数的情况
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew==NULL){
printf("动态内存分配失败\n");
exit(-1);
}
pNew->data=val;
pNew->pNext=p->pNext;
p->pNext=pNew;
return true;
}
//对链表进行排序
void sort_list(PNODE pHead){
PNODE p1 = pHead->pNext;
PNODE p2=p1;
p2=p2->pNext;
int temp;
int i,j;
//冒泡排序
while(p1->pNext!=NULL){
while(p2!=NULL){
if(p1->data>p2->data){
temp=p1->data;
p1->data=p2->data;
p2->data=temp;
}
p2=p2->pNext;
}
p1=p1->pNext;
p2=p1->pNext;
}
}
//返回链表的长度
int length_list(PNODE pHead){
int cnt=0;
PNODE p = pHead->pNext;
while(p!=NULL){
cnt++;
p=p->pNext;
}
return cnt;
}
//判断链表是否为空
bool is_empty(PNODE pHead){
//通过头结点判断链表是否为空
//注意:链表为空,头结点也存在
if(pHead->pNext==NULL){
return true;
}else{
return false;
}
}
//创建链表
PNODE create_list(void){
int len;//链表长度
int i;
int val;
printf("请输入您要生成链表节点的个数:len = ");
scanf("%d",&len);
//创建一个头结点,链表为空,头结点也存在
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(pHead==NULL){
printf("内存分配失败,程序终止\n");
exit(-1);
}
//创建一个尾节点,尾节点始终指向空
PNODE pTail = pHead;
pTail->pNext = NULL;
for(i=0;i<len;i++){
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew==NULL){
printf("内存分配失败,程序终止\n");
exit(-1);
}
pNew->data=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
return pHead;
}
//遍历链表
void traverse_list(PNODE pHead){
PNODE p = pHead->pNext;
if(pHead->pNext==NULL){
printf("链表长度为0\n");
}
while(p!=NULL){
printf("%d,",p->data);
p=p->pNext;
}
printf("\n");
}
链表操作(全)
最新推荐文章于 2023-09-05 23:33:37 发布