建立一个链表,输入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