#include<stdio.h> #include<malloc.h> //动态分配内存 #include<stdlib.h> typeof struct Node{ int data; //用来存储数据 struct Node * pNext;//用来存储下一个节点的地址 }NODE,*PNODE; PNODE create_list(void); traverse_list(PNODE pHead); bool is_empty(PNODE pHead); int length_list(PNODE pHead); bool insert_list(PNODE pHead,int pos,int val); bool delete_list(PNODE pHead,int pos,int *pVal); int main(void){ PNODE pHead = NULL: pHead = create_list(); //创建一个单链表 把第一个地址赋给pHead traverse_list(pHead); return 0; } //创建链表 PNODE create_list(void){ int len; int i; int val; PNODE pHead = (PNODE)malloc(sizeof(NODE)); //动态创建一个节点 为头节点 if(pHead==NULL){ printf("分配失败"); exit(-1); } PNODE pTail = pHead; //拷贝一个节点 每次新增节点之后pTail就向后指向一个 pTail->pNext=NULL;//初始化时候 只有一个节点 不执行任何节点 printf("请输入创建链表的长度 len= "); scanf("%d",&len); for(i=0;i<len;i++){ printf("输出第%d个节点的值",i+1); scanf("%d",&val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(pNew==NULL){ printf("分配失败"); exit(-1); } pNew->data=val; //新创建的节点 pNew->pNext=NULL; pTail->pNext=pNew; //新创建的数据和链条进行关联 pTail=pNew; //尾指针 指向最后一个元素地址 } return pHead; } //输出链表 traverse_list(PNODE pHead){ PNODE p=pHead->pNext; while(NULL!=p){ printf("%d",p->data); p=p->pNext; } printf("\n"); return; } bool is_empty(PNODE pHead){ if(pHead->pNext==NULL){ return true; }else{ return false; } } int length_list(PNODE pHead){ PNODE p=pHead->pNext; int len=0; while(p!=NULL){ p=p->pNext; len++; } return len; } bool insert_list(PNODE pHead,int pos,int val){ int i=0; PNODE p = pHead; //拿到 pos的前一个元素 while(NULL!=p&&i<pos-1){ p=p->pNext; i++; } //这种判断 i 是否超标,效率比较高一点(传统的是遍历整个链表,判断i是否超了整个链表长度) //这种判断 直接判断了 i 是否在链表范围内 if(i>pos-1||NULL==p){ 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; } bool delete_list(PNODE pHead,int pos,int *pVal){ int i=0; PNODE p = pHead; //找到 pos 的前一个元素 while(NULL!=p->pNext&&i<pos-1){ p=p->pNext; i++; } //判断坐标是否合法 判断要删除的对象是否存在 if(i>pos-1||NULL=p->pNext){ return false; } //获得要删除的对象 PNODE q=p->pNext; *val=q->data; p->pNext=p->pNext->pNext; free(q); q=NULL; return true; }