乐逍遥xwl

导航

数据结构 线性链表

  1 #include<stdio.h> 
  2 #include<stdlib.h>
  3  
  4 #define OK 1
  5 #define ERROR 0
  6 #define OVERFLOW -1
  7 
  8 typedef int Elemtype;
  9 
 10 typedef struct LNode//线性链表 
 11 {
 12     Elemtype data;
 13     struct LNode *next;
 14     
 15 } LNode,*Linklist;
 16 
 17 int init_Linklist(Linklist &l)
 18 {
 19     l=(Linklist)malloc(sizeof(LNode));//建立头结点,并给头结点元素赋初值
 20     
 21     if(!l)
 22         exit(OVERFLOW);    
 23     
 24     l->next=NULL;
 25     l->data=0;
 26         
 27     return OK;
 28 }
 29 
 30 int input_Linklist(Linklist &l)
 31 {
 32     int n;
 33     printf("\n输入个数:\n");
 34     scanf("%d",&n);
 35     printf("\n输入数据:\n");
 36     
 37     Linklist tail = l;//新建一个临时的尾节点 
 38     
 39     for(int i=0;i<n;i++)
 40     {
 41         Linklist p=(Linklist)malloc(sizeof(LNode));//新建一个节点为当前节点 
 42         scanf("%d",&p->data);
 43         
 44         p->next=tail->next;
 45         tail->next=p;//尾接法     
 46         
 47         tail=tail->next;//保持为尾节点,使链表创建顺序正常 
 48     }
 49     return OK;
 50 }
 51 
 52 int get_Elem(Linklist l,int i,Elemtype &e)
 53 {
 54     //l为带头结点的单链表的头指针
 55     //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
 56     Linklist p=l->next;
 57     int j=1;
 58     while(p&&j<i)
 59     {
 60         p=p->next;
 61         j++;
 62     }
 63     
 64     if(!p||j>i)
 65         return ERROR;
 66     
 67     e=p->data;
 68     return OK;
 69 }
 70 
 71 int insert_Linklist(Linklist &l,int i,Elemtype e)
 72 {
 73     //在带头结点的单链表l的第i个位置之前插入元素e
 74     Linklist p=l;
 75     int j=0;
 76     
 77     while(p&&j<i-1)//找到第i-1结点,(j=0头结点/j=1第1结点)
 78     {
 79         p=p->next;
 80         j++;
 81     }
 82     
 83     if(!p||j>i-1)//p为空/i输入错误
 84         return ERROR;
 85     
 86     Linklist s=(Linklist)malloc(sizeof(LNode));
 87     
 88     s->data=e;
 89     s->next=p->next;
 90     p->next=s;
 91     
 92     return OK;
 93 }
 94 
 95 int delete_Linklist(Linklist &l,int i,Elemtype &e)
 96 {
 97     //在带头结点的单链表l中,删除第i个元素,并使e返回其值
 98     Linklist p=l;
 99     int j=0;
100     
101     while(p->next&&j<i-1)//寻找第i个节点,并令p指向其前驱节点 
102     {
103         p=p->next;
104         j++; 
105     }
106     
107     if(!(p->next)||j>i-1)
108         return ERROR;//删除位置不合理
109     
110     Linklist q=p->next;
111     p->next=q->next;//链表中删去q节点 
112     e=q->data;//记录数据 
113     free(q);//释放q节点 
114     
115     return OK; 
116 }
117 
118 int output_Linklist(Linklist &l)
119 {
120     printf("\nLinklist:\n");
121     
122     Linklist p=l;
123     
124     while(p->next!=NULL)
125     {
126         printf("%5d",p->next->data);
127         p=p->next;
128     }
129     printf("\n");
130     
131     return OK;
132 }
133 
134 int free_Linklist(Linklist &l)
135 {
136     while(l->next!=NULL)
137     {
138         Linklist Q=l->next;
139         l->next=Q->next;//删去表头的后一个节点 
140         
141         free(Q);//释放该节点 
142     }
143     free(l);//头结点也释放 
144     
145     return OK;
146 }
147  
148 int main()
149 {
150     Linklist la;
151     
152     init_Linklist(la);
153     
154     printf("\n请输入线性链表A:\n");
155     input_Linklist(la);
156     
157     
158     printf("\n线性链表A为:\n");
159     
160     output_Linklist(la);
161     
162     free_Linklist(la); 
163     
164     return 0;
165 }

 

 

PS:这个月一篇博客都没发,不知道干啥去了,想了想还是水一篇博客吧,这个是数据结构课里面的线性链表,

主要有链表创建、输入输出、插入、删除、释放等操作,仅供参考......

posted on 2019-10-30 18:55  乐逍遥xwl  阅读(190)  评论(0编辑  收藏  举报