单链表创建,删除节点,获取元素(与线性表比较)

 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 070 }
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 } 

比较简单,都写上注释,单链表我研究了一天,都没做出一道题目,就是在单链表中删除所有重复的节点,指针指来指去,头都晕,如果就是删除一个就简单,在单链表没有索引,所以只能靠指针,先排序再删除,现在我还没做出来,就差一步,先放着,做了那么久,累了。

posted @ 2016-05-01 21:51  MrPat  阅读(435)  评论(0编辑  收藏  举报