C语言 单链表 相关操作

数据结构 单链表

若有错误还请指出

  1 #include <stdio.h>
  2 #include <stdlib.h> 
  3 
  4 typedef struct LNode{        //定义单链表结点类型 
  5     int data;                //每个节点存放一个数据元素 
  6     struct LNode *next;        //指针指向下一个结点    
  7 }LNode,*LinkList;
  8 
  9 //判断不带头结点的单链表是否为空
 10 bool Empty1(LinkList L){
 11     return (L==NULL);
 12 } 
 13 
 14 //初始化不带头结点的单链表
 15 bool InitList1(LinkList &L){
 16     L=NULL;                    //空表,暂时还没有任何节点 
 17     return true;
 18 } 
 19 
 20 //判断带头结点的单链表是否为空
 21 bool Empty2(LinkList L){
 22     if(L->next ==NULL)
 23         return true;
 24     else
 25         return false;
 26 } 
 27 
 28 //初始化带头结点的单链表    头结点不存储数据 
 29 bool InitList2(LinkList &L){
 30     
 31     L=(LNode *)malloc(sizeof(LNode));        //分配一个头结点     
 32     if(L==NULL)                                //内存不足,分配失败 
 33         return false;
 34     L->next = NULL;                            //头结点之后暂时还没有节点 
 35     return true;
 36 } 
 37 
 38 //插入操作(带头结点)(按位)    最好时间复杂度O(1)    最差时间复杂度O(n)    平均时间复杂度O(n) 
 39 bool ListInsert2(LinkList &L,int i,int e){
 40     if(i<1)                                    
 41         return false;
 42     LNode *p;                                //指针p指向当前扫描到的结点 
 43     int j=0;                                //当前p指向的是第几个结点,可以把头结点看做是第0个结点 
 44     p=L;                                    //L指向头结点,头结点是第0个结点,但是不存储数据 
 45     while(p!=NULL && j<i-1){                //循环找到第i-1个结点 
 46         p=p->next;
 47         j++; 
 48     }
 49     if(p==NULL)                                //i的值不合法 
 50         return false;
 51     LNode *s = (LNode *)malloc (sizeof(LNode));
 52     s->data=e;
 53     s->next=p->next;
 54     p->next=s;
 55     return true; 
 56 } 
 57 
 58 //插入操作(不带头结点)(按位)    最好时间复杂度O(1)    最差时间复杂度O(n)    平均时间复杂度O(n) 
 59 bool ListInsert1(LinkList &L,int i,int e){
 60     if(i<1)                                    
 61         return false;
 62     if(i==1){                                //插入第一个结点的操作与其它结点操作不同 
 63         LNode *s = (LNode *)malloc(sizeof(LNode));
 64         s->data=e;
 65         s->next=L;
 66         L=s;                                //头指针指向新结点 
 67         return true; 
 68     } 
 69     LNode *p;                                //指针p指向当前扫描到的结点 
 70     int j=1;                                //当前p指向的是第几个结点
 71     p=L;                                    //L指向第一个结点
 72     while(p!=NULL && j<i-1){                //循环找到第i-1个结点 
 73         p=p->next;
 74         j++; 
 75     }
 76     if(p==NULL)                                //i的值不合法 
 77         return false;
 78     LNode *s = (LNode *)malloc (sizeof(LNode));
 79     s->data=e;
 80     s->next=p->next;
 81     p->next=s;
 82     return true; 
 83 } 
 84 
 85 //后插操作:在p结点之后插入元素e     O(1)
 86 bool InsertNextNode(LNode *p,int e){
 87     
 88     if (p==NULL)
 89         return false;
 90     LNode *s = (LNode *)malloc(sizeof(LNode));
 91     if(s==NULL)
 92         return false;                    //内存分配失败
 93     s->data=e;                            //用结点s保存数据元素e 
 94     s->next=p->next;
 95     p->next=s;                            //将结点s连接到p之后 
 96     return true; 
 97 } 
 98 
 99 //前插操作:在p结点之前插入元素    O(1)
100 bool InsertPriorNode(LNode *p,int e){
101     
102     if(p==NULL)
103         return false;
104     LNode *s = (LNode *)malloc(sizeof(LNode));
105     if(s==NULL)
106         return false;                    //内存分配失败
107     
108     s->next=p->next;
109     p->next=s;                            //新节点s连接到p之后 
110     s->data=p->data;                    //将p中元素复制到s中 
111     p->data=e;                            //p中元素覆盖为e 
112     return true; 
113 } 
114 
115 //按位序删除(带头节点)        最好时间复杂度O(1)    最差时间复杂度O(n)    平均时间复杂度O(n) 
116 bool ListDelete(LinkList &L,int i,int &e){
117     
118     if(i<1)
119         return false;
120     LNode *p;                            //指针p指向当前扫描到的结点
121     int j=0;                            //当前指针p指向的是第几个结点
122     p=L;                                //L指向头结点
123     
124     while(p!=NULL && j<i-1){            //循环找到第i-1个结点 
125         p=p->next;
126         j++;
127     } 
128     if(p==NULL)
129         return false;
130     if(p->next == NULL)
131         return false;
132     
133     LNode *q=p->next;                    //令Q指向被删除的结点
134     e = q->data;                        //用e返回元素的值
135     p->next = q->next;                    //将*q结点从链中断开 
136     free(q);                            //释放结点的存储空间 
137     return true; 
138 } 
139 
140 //删除指定结点p 该方法存在问题,若删除最后一个结点会报错,暂时先用着,考试的时候可能会扣一分左右 
141 bool DeleteNode(LNode *p){
142     if(p==NULL)
143         return false;
144     LNode *q=p->next;                    //令q指向*p的后继结点 
145     p->data=p->next->data;                //和后继结点交换数据域 
146     p->next=q->next;                    //将*q结点从链中断开 
147     free(q);                            //释放后继结点的存储空间 
148     return true;
149 } 
150 
151 //按位查找 带头结点 
152 LNode *GetElem(LinkList L,int i){
153     
154     if(i<0)
155         return NULL;
156     LNode *p;                    //指针p指向当前扫描到的结点 
157     int j=0;                    //当前p指向的是第几个结点 
158     p=L;                        //L指向头结点 
159     while(p!=NULL && j<i){        //循环找到第i个结点 
160         p=p->next;
161         j++;
162     } 
163     return p;
164 } 
165 
166 //按值查找 带头结点
167 LNode * LocateElem(LinkList L,int e){
168     
169     LNode *p=L->next;
170     while(p!=NULL && p->data != e)
171         p=p->next;
172     return p;
173 } 
174  
175 
176 int main(){
177     return 0;
178 } 

 补充一下头插法和尾插法

 1 //尾插法建立单链表
 2 LinkList List_TailInsert(LinkList &L){    
 3     int x;                                    //结点的data 
 4     L=(LinkList)malloc(sizeof(LNode));        //建立头结点
 5     LNode *s,*r=L;                            //r为表尾指针
 6     scanf("%d",&x);                            //输入结点的值 
 7     while(x!=9999){                            //输入9999表示结束 
 8         
 9         s=(LNode *)malloc(sizeof(LNode));
10         s->data=x;
11         r->next=s;
12         r=s;
13         scanf("%d",&x); 
14     } 
15     r->next=NULL;
16     return L;
17 } 
18 
19 //头插法建立单链表
20 LinkList List_HeadInsert(LinkList &L){
21 
22     LNode *s;
23     int x;
24     L=(LinkList)malloc(sizeof(LNode));        //创建头结点 
25     L->next=NULL;                            //初始为空链表 
26     scanf("%d",&x);                            //输入结点的值 
27     while(x!=9999){
28         
29         s=(LNode *)malloc(sizeof(LNode));        //创建新结点 
30         s->data=x;
31         s->next=L->next;
32         L->next=s;                            //将新节点插入表中,L为头指针 
33         scanf("%d",&x); 
34     } 
35     return L;
36 } 

 

posted @ 2021-07-07 16:10  徐柿子  阅读(56)  评论(0)    收藏  举报