首先,我们定义带头节点的单链表存储结构如下:
1 /* 2 ** 线性表的单链表存储结构定义 */ 3 typedef int ListElemType;//线性表数据元素类型 4 typedef struct tagLNode { 5 ListElemType data; 6 struct tagLNode *next; 7 }LNode, *LinkList;
在此基础上可以执行的基本操作如下:
1 #include "linklist_algo.h" 2 #include <stdlib.h> 3 4 /* 5 ** 初始化单链表 6 */ 7 void LinkList_Init(LinkList *list) 8 { 9 *list = (LinkList)malloc(sizeof(LNode)); 10 if (!*list) exit(EXIT_FAILURE); 11 (*list)->data = 0; 12 (*list)->next = NULL;//头结点的指针域为空 13 } 14 15 /* 16 ** 插入 17 */ 18 int LinkList_Insert(LinkList list, int index, ListElemType e) 19 { 20 int i = 0;//计数器初值为0 21 LinkList node = NULL, p = list;//p指向头结点 22 while (p && i < index-1){//寻找第iindex-1个结点 23 i++; p = p->next; 24 } 25 if (i > index-1 || !p) return 0;//第index-1个结点不存在 26 node = (LinkList)malloc(sizeof(LNode)); 27 if (!node) return -1; 28 //在第index元素之前插入新结点 29 node->data = e; 30 node->next = p->next; 31 p->next = node; 32 return 1; 33 } 34 35 /* 36 ** 读取元素 37 */ 38 int LinkList_GetElem(LinkList list, int index, ListElemType *elem) 39 { 40 int i = 1;//计数器初始化为1 41 LinkList p = list->next;//p指向第1个结点 42 while (p && i < index){//寻找第index个结点 43 i++; p = p->next; 44 } 45 if (!p || i > index) return 0; 46 *elem = p->data; 47 return 1; 48 } 49 50 /* 51 ** 删除 52 */ 53 int LinkList_Delete(LinkList list, int index, ListElemType *e) 54 { 55 int i = 0;//计数器初值为0 56 LinkList q, p = list;//p指向头结点 57 while (p->next && i < index-1){ 58 i++; p = p->next;//寻找第index-1个结点 59 } 60 if (i > index-1 || !p->next) return 0;//删除位置不合法 61 q = p->next;//q指向待删除结点,p指向待删除结点的前驱 62 *e = q->data; 63 p->next = q->next;//断开待删除结点与线性表的连接 64 free(q);//释放被删除结点的内存 65 return 1; 66 }
最后,附上测试程序:
1 #include <stdio.h> 2 #include "linklist_algo.h" 3 4 void visit(ListElemType e) 5 { 6 printf(" %d ", e); 7 } 8 9 int compare(ListElemType e1, ListElemType e2) 10 { 11 if (e1 == e2) return 1; 12 return 0; 13 } 14 15 //For Test 16 int main(int argc, char **argv) 17 { 18 LinkList List; 19 ListElemType e; 20 int i = 0, index; 21 22 LinkList_Init(&List);//初始化空表 23 //插入元素 24 LinkList_Insert(List, 1, 11); 25 LinkList_Insert(List, 2, 22); 26 LinkList_Insert(List, 1, 33); 27 //读取元素 28 if (LinkList_GetElem(List, 2, &e)){ 29 printf("Get 2-th Element : %d\n", e); 30 } 31 //删除结点 32 if (LinkList_Delete(List, 3, &e)){ 33 printf("Delete 3rd : %d\n", e); 34 } 35 36 return 0; 37 }
时间: 2024-10-27 13:54:20