单链表创建,删除节点,获取元素(与线性表比较)
1 //用c语言描述单链表 2 3 //缺点,比起线性表,找出第i个元素很困难,时间复杂度为o(n),线性表只要直接下标获取,时间复杂度为O(1) 4 //优点,单链表的插入和删除时非常方便的,时间复杂度为o(1),线性表的插入和删除最后情况是删除和插入第一个元素,时间复杂度为o(n) 5 6 7 #include <stdio.h> 8 typedef int ElemType; 9 typedef int Status; 10 11 //1.单链表的初始化 12 13 typedef struct Node //定义一个节点 14 { 15 ElemType data ; //用来存储数据,数据域 16 struct Node *next ;//用来存放下一个节点的地址,指针域 17 } Node; 18 typedef struct Node * LinkList; //取别名,遇到LinkList相当于遇到Node 19 20 21 //******************************************************************************* 22 23 //2.找出第i个元素 24 25 Status GetElement(LinkList L,int i,ElemType *e) 26 { 27 int j=1; //记录当前位置 28 LinkList p; 29 p=L->next; //p指向单链表的第一个指针,必须为l->next,因为头节点没数据 30 while(p && j<i) //最坏情况是i=n,所以时间复杂度为o(n) 31 { 32 p=p->next; //把下一个节点的地址复制给p 33 ++j; //当前位置加1 34 } 35 36 if(!p || j>i) //若p为空或者j大于单链表的长度退出程序 37 return -1; 38 39 *e=p->data; 40 return *e; 41 } 42 43 //******************************************************************************* 44 45 //3.单链表的插入 46 47 Status ListInsert(LinkList *L,int i,ElemType e) 48 { 49 int j=1; //记录当前位置 50 LinkList p,s; 51 p=*L; //p指向当前的地址,当头节点为空也能插入, 52 while(p && j<i) //最坏情况是i=n,所以时间复杂度为o(n) 53 { 54 p=p->next; //把下一个节点的地址复制给p 55 ++j; //当前位置加1 56 } 57 58 if(!p || j>i) //若p为空或者j大于单链表的长度退出程序 59 return -1; 60 61 s=(LinkList) malloc(sizeof (Node)); //因为插入一个新元素,必须定义为一个节点才可以插入单链表中 62 s->data =e; //把e的值赋值给新的节点的data 63 64 s->next=p->next; //s的next指针存放的是p->next 的指针 65 66 p->next=s; //p->next指向s, 67 68 free s; 69 return 0; 70 } 71 72 73 74 75 //******************************************************************************* 76 77 //4.单链表的删除 思想(p->next=p->next->next) 78 Status ListDelete(LinkList L,int i,ElemType* e) 79 { 80 int j=1; //记录当前位置 81 LinkList p,q; 82 p=*L; //p指向当前的地址, 83 while(p && j<i) //最坏情况是i=n,所以时间复杂度为o(n) 84 { 85 p=p->next; //把下一个节点的地址复制给p 86 ++j; //当前位置加1 87 } 88 if(!p || j>i) //若p为空或者j大于单链表的长度退出程序 89 return -1; 90 91 92 q=p->next; 93 p->next =q->next; //这两句相当于p->next =p ->next ->next; 94 95 *e=q->date; 96 97 return 0; 98 }
比较简单,都写上注释,单链表我研究了一天,都没做出一道题目,就是在单链表中删除所有重复的节点,指针指来指去,头都晕,如果就是删除一个就简单,在单链表没有索引,所以只能靠指针,先排序再删除,现在我还没做出来,就差一步,先放着,做了那么久,累了。
博客园的文章都是大学时写的,质量不太好。
我的新文章都会发布再新的 blog :https://blog.biyongyao.com
请大家关注哟!!