ช่วยแก้โค๊ดหั้ยทีน่ะค่ะ <b>ช่วยทีค่ะส่งก่อนห้าทุ่มวันนี้ค่ะ</b>โปรแกรมที่รวมรายการโยงสองสายเข้าด้วยกัน
ช่วยทีค่ะส่งก่อนห้าทุ่มวันนี้ค่ะ
โปรแกรมที่รวมรายการโยงสองสายเข้าด้วยกัน โดยที่ผลลัพธ์เป็นรายการโยงที่มีการเรียงลำดับจากน้อยไปมาก สมมุติให้ข้อมูลที่เก็บในรายการโยงทั้งสองสายนั้นเรียงลำดับจากน้อยไปมาก (ต้องคำนึงถึงวิธีดำเนินการที่มีประสิทธิภาพสูงสุด)
เช่น
List1: 1, 3, 5, 6, 8, 10
List2: 1, 2, 8, 16, 32, 50
AList: 1, 1, 2, 3, 5, 6, 8, 8, 10, 16, 32, 50
แก้โค๊ดนี่น่ะค่ะ
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef int NODEVAL;
typedef struct node{
NODEVAL val;
struct node *next;
} LISTNODE;
typedef struct list{
LISTNODE *head;
} LIST;
LISTNODE *getnode(NODEVAL v){
LISTNODE *n;
n = new LISTNODE;
// n = (LISTNODE *)malloc(sizeof(LISTNODE));
n->val = v;
n->next = NULL;
return n;
}
LIST *createList(){
LIST *l;
l = new LIST;
l->head = NULL;
return l;
}
// isListEmpty() is a function to check whether
// list is empty.
// return value:
// return 1 if list is empty, else return 0.
int isListEmpty(LIST *l)
{
return (l->head == NULL);
}
void insFront(LIST *l, LISTNODE *n){
n->next = l->head;
l->head = n;
}
void insAfter(LISTNODE *pre, LISTNODE *n){
n->next = pre->next;
pre->next = n;
}
void insEnd(LISTNODE *pre, LISTNODE *n){
insAfter(pre, n);
}
void insOrdList(LIST *l, LISTNODE *n){
if(isListEmpty(l))
insFront(l, n); // ins first node
else{
LISTNODE *ptr, *pre=NULL;
ptr = l->head;
while((ptr->val < n->val ) && ptr->next!=NULL){
pre = ptr;
ptr = ptr->next;
}
if(ptr->val == n->val)
insAfter(ptr, n); // same val, ins into
else{
if(ptr->val < n->val) // ins end
insAfter(ptr, n);
else if(ptr==l->head)
insFront(l, n); // ins before head-node
else
insAfter(pre, n); // ins between list
}
}
}
void delFront(LIST *l){
LISTNODE *save;
save = l->head;
l->head = (l->head)->next;
delete save; // free(save);
}
void delAfter(LISTNODE *pre){
LISTNODE *save;
save = pre->next;
pre->next = save->next;
delete save; // free(save);
}
void delOrdList(LIST *l, NODEVAL target){
if(isListEmpty(l))
return;
else{
LISTNODE *ptr, *pre=NULL;
ptr = l->head;
while((ptr->val != target) && ptr->next!=NULL){
pre = ptr;
ptr = ptr->next;
}
if(ptr->val != target)
return; // no data found.
else{
if(ptr==l->head)
delFront(l); // del head
else
delAfter(pre); // del after
}
}
}
void printList(LIST *l)
{
LISTNODE *ptr = l->head;
while( ptr != NULL ){
printf("%3d", ptr->val);
ptr = ptr->next; // next node
}
printf("\n");
}
main()
{
LIST *list;
LISTNODE *node;
list = createList();
int i, v;
for(i=1;i<=4;i++){
printf("INSERT number(%d) into list: ", i);
scanf("%d", &v);
node = getnode(v);
insOrdList(list, node);
}
printList(list);
printf("DELETE: ");
scanf("%d", &v);
delOrdList(list, v);
printList(list);
getch();
}
# แก้ไขโค้ดตัวอย่างจากน main() ให้มีได้ 2 list จากนั้นจึงสร้างฟังก์ชัน mergeList() เพื่อผสาน list ทั้งสอง
void mergeList(LIST *l1, LIST *l2){
? ? ...
? ?...
} Tag : - - - -
Date :
2010-06-30 18:15:30
By :
pleza
View :
1221
Reply :
0
Load balance : Server 03