数据结构论坛

首页 » 分类 » 分类 » 数据结构C实现顺序表链表
TUhjnbcbe - 2021/7/12 18:50:00
程少为 http://pf.39.net/bdfyy/bdfzg/201217/8505686.html

因为数据结构考试的大题是这两个,所以抽一点时间实现了一下:

运行的环境是这样的

#includestdio.h#include"stdlib.h"#include"string.h"//创建一个节点structNode{inta;//数据域structNode*next;//指针域,指向数据的节点};//全局定义头尾指针方便调用structNode*head=NULL;structNode*end=NULL;//创建一个链表,初始化的工作voidAddListTill(inta){structNode*temp=(structNode*)malloc(sizeof(structNode));//进行强制类型转换//创建一个节点temp-a=a;temp-next=NULL;//连接分为两种情况,一种是没有节点,一种是有节点,将东西加到节点上面if(NULL==head){head=temp;}else{end-next=temp;//尾节点应该指向最后一个}end=temp;//尾节点应该始终指向最后一个节点}//函数的功能是尾添加的方式在尾节点添加的方式增加一个节点,输入的参数就是这个节点的数据。首先创建一个节点,并且申请一个节点的内存//,之后对传入节点的数据进行赋值,尾添加的节点应该是指向NULL。此时就是也该判断了,要考虑节点的存在问题//遍历链表----查的操作voidScanList(){structNode*temp=head;//定义一个临时变量来指向头while(temp!=NULL){printf("%d\n",temp-a);temp=temp-next;//temp指向限一个地址,实现了++的操作}//函数的作用是遍历这个链表,首先定义一个用于遍历的指针变量(是临时的),用while循环遍历输出}structNode*FindNode(inta){structNode*temp=head;while(temp!=NULL){if(a==temp-a){return(temp);}temp=temp-next;}//没找到return(NULL);}//找到就返回节点,找不到就返回NULL//链表清空----不就是全部删除voidFreeList(){//一个一个的NULLstructNode*temp=head;//定义一个临时变量来指向头while(temp!=NULL){structNode*pt=temp;temp=temp-next;//temp指向下一个地址free(pt);//释放当前}//头尾清空,不然下次的头会出现别的情况head=NULL;end=NULL;}//使用遍历的做法来逐个的释放对应的节点,,在最后应该将头尾节点变NULL,否则下次的链表会接着这次的链表的头尾//指定的位置插入节点----在指定位置增加voidAddListRand(intindex,inta){if(NULL==head){printf("链表没有节点\n");return;}structNode*pt=FindNode(index);if(NULL==pt){printf("没有指定的节点\n");return;}//有此节点。创建临时的节点,申请对应可以使用的内粗空间structNode*temp=(structNode*)malloc(sizeof(structNode));//节点成员间进行赋值temp-a=a;temp-next=NULL;//连接到链表上1.找到节点在尾部,2.找到节点在中间if(pt==end){//尾巴的下一个加上我们的要指向的下一个要插入的节点end-next=temp;//新的尾巴end-next=temp;}else{//先连后面(先将要插入的接待你指针指向原来找到节点的下一个temp-next=pt-next;//后连前面pt-next=temp;}}//难点在于找要插入的节点位置,在这样的基础上去判断要插入的指针节点要怎么办。//尾部删除----删除的操作voidDeleteListTail(){if(NULL==end){printf("链表为空,无需删除\n");return;}//链表不为空//链表里面有一个节点if(head==end){free(head);head=NULL;end=NULL;}else{//找到尾巴的一个节点structNode*temp=head;while(temp-next!=end){temp=temp-next;}//找到了,删除尾巴//释放尾巴free(end);//尾巴的迁移end=temp;//尾巴指针为NULLend-next=NULL;}}//尾删除的过程和前面的做法一样,都是先去判断相关的系欸但的问题。只有一个节点的时候,直接置尾NULL//不为空的时候,要使用遍历但是是从后去遍历的,倒数第二个先找到,然后将最后的一个节点的内存释放了//再将第二个节点设置尾end然后将它的指针指向null//删除头的操作voidDeleteListHead(){//记住旧头structNode*temp=head;//链表监测if(NULL==head){printf("链表为空\n");return;}head=head-next;//头的第二个节点变成新的头free(temp);}//先定义一个临时变量指向旧的头,将头的第二个记为新的头指针head,然后将旧的头释放//删除一个指定的节点voidDeleteListRand(inta){//链表判断,是不是没有什么东西if(NULL==head){printf("链表没有东西\n");return;}//链表有东西,找这个节点structNode*temp=FindNode(a);if(NULL==temp){printf("查无此节点\n");return;}//找到了,且只有一个节点if(head==end){free(head);head=NULL;end=NULL;}elseif(head-next==end){if(end==temp){DeleteListTail();}elseif(temp==head){DeleteListHead();}else//多个节点{//看是删除头还是尾if(end==temp){DeleteListTail();}elseif(temp==head){DeleteListHead();}else//删除中间某一个节点{//找要删除temp的前一个,遍历structNode*pt=head;while(pt-next!=temp){pt-next=temp-next;free(temp);}}}}}intmain(){//printf("Hello,World!\n");structNode*pFind;//创建5个节点for(inti=0;i6;i++)AddListTill(i);DeleteListRand(4);ScanList();FreeList();//return0;}

链表

#includestdio.h#includestdlib.h//顺序表的实现#defineSize5//Size为申请空间的大小typedefstructTable{int*head;//声明一个名叫head的长度不确定的数组,动态数组intlength;//记录当前顺序表的长度intsize;//记录顺序表分配的存储容量}table;//此处为初始化tableinitTable(){tablet;t.head=(int*)malloc(Size*sizeof(int));if(!t.head){printf("初始化失败!");exit(0);}t.length=0;t.size=Size;return(t);}tableaddTable(tablet,intelem,intadd){if(addt.length+1

add1){printf("插入的位置有问题\n");return(t);}if(t.length=t.size){t.head=(int*)realloc(t.head,(t.size+1)*sizeof(int));if(!t.head){printf("存储分配失败\n");}t.size+=1;}for(inti=t.length-1;i=add-1;i--){t.head[i+1]=t.head;}t.head[add-1]=elem;t.length++;return(t);}tabledelTable(tablet,intadd){if(addt.length

add1){printf("被删除元素的位置有误\n");return(t);}for(inti=add;it.length;i++){t.head[i-1]=t.head;}t.length--;return(t);}tableselectTable(tablet,intelem){for(inti=0;it.length;i++){if(t.head==elem){return(i+1);}}return(-1)}tableamendTable(tablet,int)//输出顺序表中元素的函数voiddisplayTable(tablet){for(inti=0;it.length;i++){printf("%d",t.head);}printf("\n");}//tableintmain(){tablet=initTable();//向顺序表里面添加元素for(inti=1;i=Size;i++){t.head[i-1]=i;t.length++;}printf("顺序表中的元素分别是:\n");return(0);}

顺序表的实现

祝大家考试顺利呀~

预览时标签不可点收录于话题#个上一篇下一篇
1