1、链表基本操作#include /标准函数输出库#include /包含malloc()函数的函数库#define OK 1 /宏定义OK为1#define ERROR 0 /宏定义ERROR为0struct Node int ele; struct Node* next;/* 顺序表的表示方法*/typedef struct struct Node* pData; int length; LinkedList;/* 顺序表的初始化 */LinkedList* InitList(LinkedList* L) if (NULL=L) L=(LinkedList*)malloc(sizeof(Lin
2、kedList); /如果链表不存在则开辟空间 if(!L) printf(为L申请空间失败!n); /如果申请失败输出提示语 L-pData=(struct Node*)malloc(sizeof(struct Node); /为指针头结点开辟空间 if(!L-pData) printf(为L-pData申请空间失败!n); return NULL; else L-pData-next=NULL; /头结点指向空 L-length=0; /链表长度为0 return L;/* 顺序表的销毁 */int DestroyList(LinkedList* L) int k=1; struct No
3、de *p=L-pData-next, *q=L-pData; for (k=1;klength; k+) free(q); /释放指针q所指向的空间 q=p; /p指针顺序后移 p=q-next; free(q); /释放最后结点的内存 L-pData=NULL; /把链表地址置空 return 1;/* 向第i个位置插入值为x的元素, 在第一个位置插入数据时i为1 */int InsertElem(LinkedList* L, int x, int i) int k=0; struct Node *temp,*head; temp=(struct Node*)malloc(sizeof(s
4、truct Node); /为新插入的结点开辟空间 temp-ele=x; /把要插入的值插入到指定位置 temp-next=NULL; /节点指向的位置为空 head=L-pData; /把链表的头指针赋给head if(!L-pData | i-1L-length) printf(顺序表或是数据位置有问题, 不能插入!); return ERROR; for(k=1; knext; /找到要插入位置 temp-next=head-next; /要插入位置的节点地址赋给temp-next head-next=temp; /把要插入的节点的指针赋给head-next temp=NULL; /把
5、temp置空 L-length+; /链表长度加1 return OK;/* 按位置删除: 删除第i个位置上的元素, 第一个位置用1表示 */int DeleteElem(LinkedList* L, int i) int k=0; struct Node *head, *temp; if(!L-pData | 0=L-length | iL-length) return ERROR; head=L-pData; for (k=1; knext; temp=head-next; /把要删除的位置的地址赋给temp head-next=head-next-next; /把删除位置的地址赋给它节点
6、的指针域 free(temp); /把删除的节点的内存释放 temp=NULL; /置空temp L-length-; /表长度减1 return OK;/*逆转整个顺序表: 即把整个顺序里面的元素的顺序反转过来*/int ReverseList(LinkedList* L) int k=0; struct Node *p, *q; / 结点指针 if (L-lengthpData-next-next; / 指向第2个元素 q=p-next; / q指向第3个元素 L-pData-next-next=NULL; / 将第1个元素的下个指针设为NULL, 成为线性表的最后一个元素 for (k=
7、2; klength-1; k+) / 最后一个元素单独处理 p-next=L-pData-next; L-pData-next=p; p=q; q=p-next; /依次把前一节点的地址赋给后一节点的指针域,后一节点的地址赋给头结点的指针域 p-next=L-pData-next; /把倒数第二个的地址赋给最后一个节点的指针域 L-pData-next=p; /头结点指向最后一个节点 return OK;/* 输出某个数据 */void PrintNode(struct Node x) printf(%d ,x.ele); /输出元素的值/* 输出顺序表中的每个元素 */void Print
8、List(LinkedList* L) int k=0; struct Node* temp=NULL; if(!L-pData | !L) printf(顺序表不存在!n); return; if(0=L-length) printf(顺序表是空的!n); return; printf(表中的元素有:n); temp=L-pData; /把链表的头指针赋给temp for(k=1; klength; k+) temp=temp-next; PrintNode(*temp); printf(n);/* 置空表 */int SetEmpty(LinkedList* L) int k=1; str
9、uct Node *p=L-pData-next-next,*q=L-pData-next; /p指向第2个元素,q指向第1个元素 for (k=2;klength;k+) /依次置空单链表节点 free(q); /释放指针q指向的节点的空间 q=p; /使p指针指向下一节点 p=q-next; /使p指针指向下一节点 free(q); /释放指针q指向的尾节点的空间 L-length=0; L-pData-next=NULL; /置空指向单链表头节点后一节点的指针 return OK; /返回值表示操作成功/* 求表长 */int GetListLength(LinkedList* L)in
10、t GetListLength(LinkedList* L) /求表长的函数 if(L-pData) /判断单链表是否被分配内存 return L-length; /返回单链表的长度 return -1; /单链表没有分配内存时, 返回-1/* 求前驱 */int GetPrior(LinkedList* L, int x) struct Node *temp=L-pData-next,*prior=L-pData; /temp指向第1个元素, prior指向temp前一个元素 while(temp) /当temp指向的节点不为空时循环 if (temp-ele!=x) /判断指针temp指向
11、的节点的值是否是否等于目标值 prior=temp; /使指针prior指向指针temp指向的节点空间 temp=prior-next; /将指针temp指向后一节点 else if(prior!=L-pData) /判断指针prior指向的节点是否是头节点 /头结点无前驱 return prior-ele; /返回指针prior指向的节点的值域的值 else if(prior=L-pData) /判断指针prior指向的节点是否是头节点 printf(首节点无前驱,); return ERROR; /返回值表示操作失败 printf(无此元素,); return ERROR; /返回值表示操
12、作失败/* 求后继 */int GetNext(LinkedList* L, int x) struct Node *temp=L-pData-next; /temp指向第1个元素,prior指向temp前一个元素 while(temp) /当temp指向的节点不为空时循环 if (temp-ele!=x) /判断指针temp指向的节点的值是否是否等于目标值 temp=temp-next; /使指针temp指向下一节点空间 else if (temp-next!=NULL) /判断指针temp指向的节点是否是尾节点 return temp-next-ele; /返回指针temp指向的节点的后一
13、节点的值域的值 else if(temp-next=NULL) /判断指针temp指向的节点是否是尾节点 printf(尾节点无后继,); return ERROR; /返回值表示操作失败 printf(无此元素,); return ERROR; /返回值表示操作失败/* 按位置查找元素 */int GetElem(LinkedList* L, int i) int k=1; struct Node* temp=L-pData; /使指针temp指向头结点 if(0=i|!L-pData|iL-length) /判断查找的位置是否合法 printf(单链表不存在或是为空表,); return
14、ERROR; /返回值表示操作失败 for(k=1;knext; /使指针temp指向下一节点空间 return temp-ele; /返回指针temp指向的节点的值域的值 /* 查找元素第一个位置, 若无返回-1 */int GetPosition(LinkedList* L, int x) int k=0; struct Node* p; /定义指向节点的指针 if(!L-pData) /判断单链表是否被分配内存 printf(单链表不存在!n); p=L-pData; /将指针p指向头结点 for(k=1;klength;k+) /循环查找元素位置 p=p-next; /使指针p指向下一
15、节点空间 if(p-ele=x) /判断是否与指定值相符 return k; /返回值表示查到的位置 return -1; /返回值表示单链表中无此元素/*判断是否为空: 1为空, 0为非空*/int IsEmpty(LinkedList* L) if(!L-pData) /判断单链表是否被分配存储空间 printf(单链表不存在!n); return L-length=0; /返回值表示单链表是空的void main() LinkedList* L=NULL; L=InitList(L); / 初始化顺序表 PrintList(L); / 打印顺序表 InsertElem(L, 10, 1)
16、; / 把元素10插入到第1个位置 InsertElem(L, 12, 1); / 把元素10插入到第1个位置 InsertElem(L, 14, 1); / 把元素10插入到第1个位置 PrintList(L); / 打印顺序表 printf(获取元素10位置:); printf(%dn, GetPosition(L, 10); / 获取元素10所在的位置 printf(获取第三个元素:); printf(%dn, GetElem(L, 3); / 获取第i个元素 printf(删除第二个元素后); DeleteElem(L,2); PrintList(L); / 打印顺序表 if(IsEmpty(L) printf(顺序表是空的n); else printf(顺序表是非空的n); SetEmpty(L); / 把顺序表置空 PrintList(L); / 打印顺序表 DestroyList(L); / 不要忘了 PrintList(L); / 打印顺序表 if (NULL!=L) free(L);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1