目录

- #include
- #include
-
- typedef int ElemType;
-
- typedef struct LNode {
- ElemType data;
- struct LNode*next;
- }LNode,*LinkList;
-
- //清单列表
- void MenuLinkList(){
- printf("-------------1.插入操作-------------\n");
- printf("-------------2.定位插入操作---------\n");
- printf("-------------3.按序查找操作---------\n");
- printf("-------------4.按值查找操作---------\n");
- printf("-------------5.定位删除操作---------\n");
- printf("-------------6.按值删除元素---------\n");
- printf("-------------7.删除整个表-----------\n");
- printf("-------------8.表的长度-------------\n");
- printf("-------------9.打印操作-------------\n");
- printf("-------------10.结束操作-------------\n");
- }
- //初始化不带头节点
- void InitList(LinkList&L){
- L=NULL;
- }
- //销毁表的操作
- void DestryLinkList(LinkList&L){
- LNode*p=L;
- //首先将第一个节点之后的所有节点删除
- while(p->next!=NULL){
- LNode*s=p->next;
- p->next=s->next;
- free(s);
- }
- //最后来删除第一个节点
- free(p);
- L=NULL;
- }
- //获取单链表的第i个节点
- LNode*GetElem(LinkList L,int i){
- int j=1;
- LNode*p=L;
- if(i<0)return NULL;
- if(i==0)return L;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- return p;
- }
(4)第i位置插入节点
- //按位序查找第i个节点指针
- LNode*FindLNode(LinkList&L,int i){
- if(i<1){
- printf("不符合插入节点位置!\n");
- return NULL;
- }
- int j=1;
- LNode*p=L;
- if(i<0)return NULL;
- if(i==0)return L->next;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- return p;
- }
- //如果插入的是在第一个节点 ,这需要进行特殊的处理
- LNode*InsertFisrtLNode(LinkList&L,ElemType e){
- LNode*s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->next=L;
- L=s;
- printf("插入节点成功!\n");
- return s;
- }
- //插入节点到第i个位序中
- void ListInsert(LinkList&L,int i,ElemType e){
- //如果i=1,这需要进行特殊的处理
- if(i==1){
- InsertFisrtLNode(L,e);
- return ;
- }
- LNode*p=FindLNode(L,i);
- if(p==NULL){
- printf("插入节点的位置不合法!\n");
- return ;
- }
- LNode*s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->next=p->next;
- p->next=s;
- printf("插入节点成功!\n");
- }
(5)指定节点的后插操作
- //指定节点的后插操作
- LNode* InsertNextNode(LNode*p,ElemType e){
- LNode*s=(LNode*)malloc(sizeof(LNode));
- if(s==NULL){
- printf("内存分配失败!\n");
- return NULL;
- }
- s->data=e;
- s->next=p->next;
- p->next=s;
- printf("插入节点成功!\n");
- return s;
- }
(6)按值删除节点和删除第i个节点
- //表的长度
- int LinkListLength(LinkList L){
- LNode*p=L;
- int len=0;
- while(p!=NULL){
- p=p->next;
- len++;
- }
- return len;
- }
- //按值删除某个节点
- void DeleteElem(LinkList&L,ElemType e){
- if(L==NULL){
- printf("表为空!\n");
- return ;
- }
- int len=LinkListLength(L);
- //用来记录是否为尾节点
- LNode*p=L;
- LNode*r;
- while(p!=NULL){
- if(p->data==e){
- //处理只有一个节点的时候(特殊)
- if(len==1){
- free(p);
- L=NULL;
- return ;
- }else{
- //p->next==NULL表示为尾节点,所以要特殊处理
- if(p->next==NULL){
- LNode*s=p;
- r->next=NULL;
- free(s);
- return ;
- }else{
- LNode*s=p->next;
- ElemType temp=p->next->data;
- p->data=temp;
- p->next=s->next;
- free(s);
- return ;
- }
- }
- }
- r=p;
- p=p->next;
- }
- }
- //删除第i个节点
- void DeleteLNode(LinkList&L,int i,ElemType&e){
- if(L==NULL){
- printf("表为空!\n");
- return;
- }
- if(i<0||i>LinkListLength(L)){
- printf("删除的位置元素不合法!\n");
- return;
- }
- //特殊情况的处理
- LNode*p=L;
- if(LinkListLength(L)==1){
- free(p);
- L=NULL;
- return ;
- }
- int j=1;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- e=p->data;
- LNode*s=p->next;
- ElemType temp=p->next->data;
- p->data=temp;
- p->next=s->next;
- free(s);
- return ;
- }
(7)按值查询存在性和打印操作
- //按值查询节点的存在性
- bool FindLNodeExist(LinkList L,ElemType e){
- LNode*p=L;
- while(p!=NULL&&p->data!=e){
- p=p->next;
- }
- if(p==NULL){
- return false;
- }
- return true;
- }
-
- //打印操作
- void DisplayLinkList(LinkList L){
- LNode*p=L;
- while(p!=NULL){
- printf("%d\t",p->data);
- p=p->next;
- }
- printf("\n");
- }
(8)主函数
- int main(){
- LinkList L;
- InitList(L);
- //对顺序表进行插入操作
- ElemType x;
- int flag=-1;
- int j=1;
- LNode*p=L;
- //各种操作
- while(1) {
- int i=0;
- ElemType e=0;
- MenuLinkList();
- printf("请输入操作: ");
- scanf("%d",&flag);
- int len=0;
- LNode*s;
- switch(flag){
- case 1:
- printf("请输入元素(-1_end): ");
- scanf("%d",&x);
- while(x!=-1) {
- //如果插入的是第一个节点,这需要进行特殊的处理
- if(j==1){
- p=InsertFisrtLNode(L,x);
- j++;
- }else{
- p=InsertNextNode(p,x);
- }
- printf("请输入元素(-1_end): ");
- scanf("%d",&x);
- }
- break;
- case 2:
- printf("请输入元素插入位置: \n");
- scanf("%d",&i);
- printf("请输入元素: ");
- scanf("%d",&x);
- ListInsert(L,i,x);
- break;
- case 3:
- printf("请输入查找元素位置: ");
- scanf("%d",&i);
- s=GetElem(L,i);
- if(s!=NULL){
- printf("查找的元素为 = %d\n",s->data);
- }
- break;
- case 4:
- printf("请输入要查找的值: ");
- scanf("%d",&x);
- if(FindLNodeExist(L,x)){
- printf("查找的元素存在!\n");
- }else{
- printf("查找的元素不存在!\n");
- }
- break;
- case 5:
- printf("请输入删除的定位位置: ");
- scanf("%d",&i);
- DeleteLNode(L,i,e);
- printf("删除的元素为 = %d\n",e);
- break;
- case 6:
- printf("请输入要删除的元素: ");
- scanf("%d",&e);
- DeleteElem(L,e);
- printf("删除成功!\n");
- break;
- case 7:
- DestryLinkList(L);
- printf("删除成功!\n");
- break;
- case 8:
- len=LinkListLength(L);
- printf("表的长度 = %d\n",len);
- break;
- case 9:
- DisplayLinkList(L);
- break;
- default:
- DestryLinkList(L);
- printf("结束操作\n");
- }
- if(flag==10){
- break;
- }
- }
- return 0;
- }
(9)测试




-
相关阅读:
【三维重建NeRF(三)】Mip-NeRF论文解读
hid-ft260驱动学习笔记 5 - ft260_i2c_probe
API管理之利剑 -- Eolink
PDF文件的页眉页脚无法删除的原因和三种替代方法
Java中的字符串
Microsoft SQL Server manual
C++运算符重载
unity打包工具
一文2000字手把手教你基于Python的UI自动化测试自学路线
Windows 下如何调试 PowerShell
-
原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126211534