首页 > 其他 > 详细

建立一个链表

时间:2021-03-28 17:30:30      阅读:20      评论:0      收藏:0      [点我收藏+]

建立一个链表,输入n个数字。若链表中有和为m的数字,删除这2个加数的第

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 typedef int Elemtype; 
  5 
  6 typedef struct Node{
  7     Elemtype data;
  8     struct Node *next;
  9 }Node,*Linklist;
 10 
 11 Linklist Linklistinit();
 12 Linklist LinklistCreatH();
 13 Linklist LinklistInsert(Linklist L,int i,Elemtype x);
 14 Linklist LinklistDelete(Linklist L,Elemtype x);
 15 void Linklistprintf(Linklist L);
 16 void Solve(Linklist L,int m);
 17 void Listappend(Linklist L,Elemtype m);
 18 
 19 Linklist Linklistinit()
 20 {
 21     Node *L;
 22     L=(Node*)malloc(sizeof(Node));
 23     if(L==NULL)
 24         printf("申请内存空间失败!\n");
 25     L->next = NULL;
 26     return L;
 27 }
 28 
 29 //头插建立单链表
 30 Linklist LinklistCreatH(Linklist L)
 31 {
 32     int i,n;
 33     if(L==NULL)
 34         return false;
 35     printf("请输入链表长度:");
 36     scanf("%d",&n);
 37     printf("请输入链表数据:");
 38     for(i=0;i<n;i++)
 39     {
 40         Node *s;
 41         int x;
 42         scanf("%d",&x);
 43         s=(Node*)malloc(sizeof(Node));
 44         s->data=x;
 45         s->next=L->next;
 46         L->next=s;
 47     }
 48     return L;
 49 }
 50 
 51 
 52 //尾插建立单链表
 53 Linklist LinklistCreatT(Linklist L)
 54 {
 55     int i,n;
 56     Node *r;
 57     r=L;
 58     if(L==NULL)
 59         return false;
 60     printf("请输入链表长度:");
 61     scanf("%d",&n);
 62     printf("请输入链表数据:");
 63     for(i=0;i<n;i++)
 64     {
 65         Node *s;
 66         int x;
 67         scanf("%d",&x);
 68         s=(Node*)malloc(sizeof(Node));
 69         s->data=x;
 70         r->next=s;
 71         r=s;
 72     }
 73     r->next=NULL;
 74     return L;    
 75 }
 76 
 77 //在链表的第i个位置插入x元素
 78 Linklist LinklistInsert(Linklist L,int i,Elemtype x)
 79 {
 80     Node *pre,*p;
 81     pre=L;
 82     int temp=0;
 83     for(temp=0;temp<i;temp++)
 84     {
 85         pre=pre->next;
 86     }
 87     p=(Node*)malloc(sizeof(Node));
 88     p->data=x;
 89     p->next=pre->next;
 90     pre->next=p;
 91     return L;
 92 }
 93 
 94 //在链表中删除值为x的元素
 95 Linklist LinklistDelete(Linklist L,Elemtype x)
 96 {
 97     Node *pre,*p;
 98     p=L->next;
 99     while(p->data!=x)
100     {
101         pre=p;
102         p=p->next;
103     }
104     pre->next=p->next;
105     free(p);
106     return L;
107 }
108 //输出单链表
109 void Linklistprintf(Linklist L)
110 {
111     Node *p;
112     p=L->next;
113     printf("链表数据:");
114     printf("%d",p->data);
115     p=p->next;
116     while(p!=NULL)
117     {
118         printf(" %d",p->data);
119         p=p->next;
120     }
121     printf("\n");
122 }
123 
124 void Solve(Linklist L,int m)
125 {
126     Node *p,*q=NULL;
127     int max=-1,flag=0;
128     p=L->next;
129     while(p!=NULL)
130     {
131         if(p->data>max)
132             max=p->data;
133     
134         q=p;
135         while(q->next!=NULL)
136         {
137             if(p->data+q->next->data==m)
138             {
139                 q->next=q->next->next;
140                 flag=1;
141             }else{
142                 q=q->next;
143             }    
144         }
145         p=p->next;
146     }
147     if(flag==0)
148     {
149         Listappend(L,m-max);
150     }
151 }
152 
153 void Listappend(Linklist L,Elemtype m)
154 {
155     Node *p;
156     p=L;
157     while(p->next!=NULL)
158     {
159         p=p->next;
160     }
161     Node *s=(Node*)malloc(sizeof(Node));
162     s->data=m;
163     s->next=p->next;
164     p->next=s;
165 }
166 
167 int main(){
168     Linklist list=Linklistinit();
169     LinklistCreatT(list);
170     Linklistprintf(list);
171     int m;
172     printf("请输入要在链表中求和的数m:");
173     scanf("%d",&m);
174     Solve(list,m);
175     Linklistprintf(list);
176     return 0;
177 }

 

2个。如果没有和为m的数,在链表末尾加入数a,使a与链表中最大的数的和为m。

建立一个链表

原文:https://www.cnblogs.com/wsl8848/p/14588882.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!