数据结构之单链表基本操作 C语言

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define OK            0
  4 #define ERROR        -1
  5 
  6 //
  7 typedef int Status;
  8 typedef int ElemType;
  9 
 10 /*
 11 单链表的存储结构:
 12 使用typedef定义的后面的LNode和*LinkList分别表示的是
 13 LNode是一个结构体类型的可以用他定义其他变量例如 LNode node即 node也为LNode类型的结构体
 14 *LinkList是一个结构体类型的指针可以用他定义其他变量例如 *LinkList node即 node也为LNode类型的结构体指针
 15 */
 16 typedef struct LNode{
 17     ElemType data; //数据域
 18     struct LNode *next; //指针域
 19 }LNode,*LinkList;
 20 
 21 int main(){
 22     ElemType data1[]={1,2,3,4,5,6,7,8,9};
 23     int n=9;
 24     //声明创建链表的方法
 25     //头插法
 26     LinkList Create_Link_Tou(ElemType data1[],int n);
 27     //尾插法
 28     LinkList Create_Link_Wei(ElemType data1[],int n);
 29     //获取第i个元素
 30     Status GetElem(LinkList L,int i);
 31     //在第i个元素之前插入元素
 32     LinkList ListInsert_L(LinkList L,int i);
 33     //删除链表中的第i个元素
 34     LinkList ListDelete_L(LinkList L,int i);
 35     //声明展示链表的方法
 36     void DisPlay(LinkList L);
 37     //循环调用Create_Link方法为链表赋值
 38     LinkList head=Create_Link_Wei(data1,n);
 39     //展示链表的方法
 40     printf("原始列表的数据为:");
 41     DisPlay(head);
 42     printf("插入后的列表的数据为:");
 43     head=ListInsert_L(head,4);
 44     DisPlay(head);
 45     head=ListDelete_L(head,3);
 46     printf("删除后的列表的数据为:");
 47     DisPlay(head);
 48     GetElem(head,5);
 49     return 0;
 50 }
 51 
 52 #if(0)
 53 //头插法创建单链表
 54 //创建链表的方法 传入的参数为链表的指针(头结点)和数据域
 55 LinkList Create_Link_Tou(ElemType data1[],int n){
 56     //给头结点分配空间
 57     LinkList head_node=(LinkList)malloc(sizeof(LNode));
 58     if(head_node==NULL){
 59         return ERROR;
 60     }
 61     head_node->next=NULL;
 62     int i;
 63     for (i =0; i <n; i++){
 64         //给链表分配内存
 65         LinkList p=(LinkList)malloc(sizeof(LNode));
 66         //进行赋值操作
 67         p->data=data1[i];
 68         p->next=head_node->next;
 69         head_node->next=p;
 70     }
 71     return head_node;
 72 }
 73 #endif
 74 
 75 #if(1)
 76 //尾插法创建单链表
 77 LinkList Create_Link_Wei(ElemType data1[],int n){
 78     //给头结点分配空间
 79     LinkList head_node=(LinkList)malloc(sizeof(LNode));
 80     if(head_node==NULL){
 81         return ERROR;
 82     }
 83     //首先将头结点的下一个指针为空
 84     head_node->next=NULL;
 85     //定义尾结点
 86     LinkList rear;
 87     //开始尾结点指向头结点
 88     rear=head_node;
 89     int i;
 90     for (i =0; i <n; i++){
 91         //给链表分配内存
 92         LinkList p=(LinkList)malloc(sizeof(LNode));
 93         //进行赋值操作
 94         p->data=data1[i];
 95         rear->next=p;
 96         rear=p;
 97     }
 98     //最后将尾结点的next为空 防止出现死循环
 99     rear->next=NULL;
100     return head_node;
101 }
102 #endif
103 
104 //展示链表的方法 传入的参数为链表的指针
105 void DisPlay(LinkList L){
106     if (L == NULL){
107         return;
108     }
109     // 链表第一个结点指针
110     LinkList temp = L->next;
111     while (temp!=NULL){
112         printf ("%4d", temp->data);
113         temp = temp->next;
114     }
115     printf ("\n");
116 }
117 
118 
119 #if(1)
120 //获取链表中的第i个元素
121 Status GetElem(LinkList L,int i){
122     //创建一个ElemType类型的变量用来接收值
123     ElemType e;
124     //创建一个链表的指针变量
125     LinkList p;
126     //p指向头结点的下一个节点,头结点为传入的参数
127     p=L->next;
128     int j=1;
129     while(p!=NULL&&j<i){
130         p=p->next;
131         ++j;
132     }
133     //如果为空返回错误
134     if(p==NULL||j>i){
135         return ERROR;
136     }
137     e=p->data;
138     printf("第%d个元素是%d\n",i,e);
139     return OK;
140 }
141 #endif
142 
143 #if(1)
144 //向单链表中插入元素的方法 在第i个元素之前插入元素e
145 LinkList ListInsert_L(LinkList L,int i){
146     ElemType e=20; //要插入的元素
147     LinkList p; //创建一个链表指针
148     int j=0;//创建一个变量
149     p=L;//将头结点赋值给指针p
150     //找到i之前的节点
151     while(p!=NULL&&j<i-1){
152         p=p->next;
153         ++j;
154     }
155     if(p==NULL||j>i-1){
156         return ERROR;
157     }
158     //创建一个新节点
159     LinkList s=(LinkList)malloc(sizeof(LNode));
160     //进行数据的赋值和指针的转换
161     s->data=e;
162     s->next=p->next;
163     p->next=s;
164     //返回头结点
165     return L;
166 }
167 #endif
168 
169 #if(1)
170 //删除链表中的第i个元素
171 LinkList ListDelete_L(LinkList L,int i){
172     int e,j=0;
173     LinkList p,q;
174     p=L;
175     //循环找到第i个元素
176     while(p->next!=NULL&&j<i-1){
177         p=p->next;
178         ++j;
179     }
180     //错误判断
181     if(p->next==NULL||j>i-1){
182         return ERROR;
183     }
184     //转换指针 删除节点
185     q=p->next;
186     p->next=q->next;
187     e=q->data;
188     printf("删除的%d元素为:%d\n",i,e);
189     return L;
190 }
191 #endif

运行结果:=========================================================================================================================================

 

posted @ 2020-03-16 08:37  萌萌~  阅读(379)  评论(0编辑  收藏  举报