C语言实现带头结点的链表的创建、查找、插入、删除操作
本文实例讲述了C语言实现带头结点的链表的创建、查找、插入、删除操作。是数据结构中链表部分的基础操作。分享给大家供大家参考。具体方法如下:
#include<stdio.h> #include<stdlib.h> typedefstructnode { intdata; structnode*next;//这个地方注意结构体变量的定义规则 }Node,*PNode; Node*createLinklist(intlength) { inti=0; PNodepHeader=NULL; PNodepTail=NULL; PNodepTemp=NULL; printf("create\n"); pHeader=(PNode)malloc(sizeof(Node));//申请头结点 if(!pHeader) { exit(-1); } pHeader->next=NULL; for(i=0;i<length;i++) { pTemp=(PNode)malloc(sizeof(Node));//用malloc要包含头文件 if(!pTemp) { exit(-1); } pTemp->data=i*10; pTemp->next=NULL; if(!pHeader->next) { //第一个结点是空的,则先连接第一个结点 pHeader->next=pTemp; } else { pTail->next=pTemp; } pTail=pTemp; } returnpHeader; } Node*search(PNodepHeader,intk) { PNodep=pHeader->next; inti=1; printf("search\n"); while(p&&(i<k)) { p=p->next; i++; } if(p&&(i==k))//这步的i==k是必须的, //因为如果一开始的时候i就>=k并且pHeader->next还不为NULL这一步就会必过,导致返回的是第一个元素的值 { returnp; } returnNULL; } intinsert(PNodepHeader,PNodepNew,intk) { PNodep=NULL; printf("insert\n"); if(1==k) { p=pHeader; } else { printf("==>"); p=search(pHeader,k-1); } if(p) { //带头结点和不带头结点的主要区别之一就在这 //如果不带头结点,那么在第一个位置插入结点的操作应该是 //pNew->next=p; //p=pNew; //带头结点的操作如下 pNew->next=p->next; p->next=pNew; return1; } return0; } intdeleteNode(PNodepHeader,intk) { PNodep=NULL; printf("deleteNode\n"); if(1==k) { p=pHeader->next; } else { printf("==>"); p=search(pHeader,k-1); } if(p&&p->next) { //不带头结点的操作时删除第一个结点的操作 //Node*temp=p; //p=p->next; //free(temp); //带头结点的操作如下 PNodetemp=p->next; p->next=temp->next; free(temp); return1; } else { printf("NotFound\n"); return0; } } voidprint(PNodepHeader) { PNodep=pHeader->next; printf("print\n"); while(p) { printf("%4d",p->data); p=p->next; } putchar('\n'); } voidfreeList(PNodepH) { PNodep=NULL; printf("freeList\n"); while(NULL!=pH) { p=pH; pH=pH->next; printf("%4dbefreed\n",p->data); free(p); } } intmain(void) { PNodepHeader=NULL;//C和C++中判断指针为空都是用NULL宏(全大写) PNodepNew=NULL; PNoderesult=NULL; pHeader=createLinklist(10); print(pHeader); result=search(pHeader,5); if(result) { printf("%d\n",result->data); } else { printf("NotFound\n"); } pNew=(PNode)malloc(sizeof(Node)); if(!pNew) { exit(-1); } pNew->data=100; pNew->next=NULL; insert(pHeader,pNew,5); print(pHeader); deleteNode(pHeader,12); print(pHeader); freeList(pHeader); return0; }
上述实例备有较为详尽的注释,相信不难理解。希望本文所述对大家C程序数据结构与算法设计有所帮助。