#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
struct people
{
char name[20];
char phone[30];
char email[30];
struct people *next;
};
int main()
{
struct people * head;
struct people *creat();
void output(struct people *head);
head=creat();
output(head);
return 0;
}
struct people *creat()
{
struct people * head;
struct people *p1,*p2;
void save(struct people *p1);
int i,n;
p1=p2=(struct people*)malloc(sizeof(struct people));
i=1;
n=0;
head=NULL;
printf("請輸入:\n");
while(i==1)
{
printf("姓名:");
scanf("%s",&p1->name);
printf("電話:");
scanf("%s",&p1->phone);
printf("Email:");
scanf("%s",&p1->email);
save(p1);
if(n==0) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct people *)malloc(sizeof(struct people));
n=n+1;
printf("繼續輸入請按1,退出請按0.\n");
scanf("%d",&i);
}
p2->next=NULL;
return(head);
}
void output(struct people *head)
{
struct people *p;
void sort(struct people *head);
printf("*************************通訊錄*************************\n");
p=head;
sort(head);
if(head!=NULL)
{
do
{printf("姓名:%s 電話:%s\n",p->name,p->phone);
p=p->next;
}while(p!=NULL);
}
}
void save(struct people *p)
{
FILE *fp;
char name[20];
printf("檔案名稱:");
scanf("%s",name);
if((fp=fopen(name,"wb"))==NULL)
{
printf("cannot open file\n");
return;
}
if(fwrite(p,sizeof(struct people),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
void sort(struct people *head)
{
struct people *p1,*p2,*tail;
tail=NULL;
while((head->next->next)!=NULL)
{
p1=head;
p2=head->next;
while((p1->next->next)!=NULL)
{
if(strcmp((p1->name),(p1->next->name))>0)
{
p1->next=p2->next;
p2->next=p2->next->next;
p1->next->next=p2;
p2=p1->next;
}
p1=p1->next;
p2=p2->next;
}
tail=p2;
}
uj5u.com熱心網友回復:
建議排序用交換資料部分,交換指標部分比較復雜和難處理呢uj5u.com熱心網友回復:
他這個問題不光是復雜的問題,整體上有一堆問題, 沒想好從頭到尾幫著改呢,還是只給sort的建議這個sort本來就是一個沒有完成的代碼,麻煩不僅僅在交換的復雜上, 還在整個交換流程的控制上
比如,head不是空頭, 是有效資料,那么頭也應該參與交換的, 但是它沒法交換,即便交換了也回傳不去
有了tail指標,本來是用來控制類似冒泡的排序程序,執行到哪兒的, 也沒有利用上
前面的save函式,也只保存當前一個節點, 整個鏈表只是重復的輸出一個節點
輸入的時候, 尾巴會多一個一個沒有意義的空節點
總之各種問題,整個代碼的大體流程是通順的,可那個細節上好多問題, 都不知道如何給建議了
uj5u.com熱心網友回復:
那應該怎么改呢uj5u.com熱心網友回復:
按照你自己的思路去改吧。這樣對你自己有好處。
哪怕有問題,哪怕方法麻煩, 走通了,你就進了一大步了
sort要想改好, head節點也是要參與排序的, 而且改了之后,頭結點不是它需要回傳,那么函式的原型就要是
struct people * sort(struct people * head);
呼叫的時候是: head = sort(head); 用回傳值更新呼叫它的head
要交換指標,你實際上需要三個東西
上一個節點 當前節點 下一個節點
交換的是當前和下一個節點, 但是交換后的結果,需要更改上一個節點的next指標
proir --> cur --> next --> more 交換前
proir --> next --> cur --> more 交換后
ptail是控制回圈范圍的, 第一次排序從頭到結尾的
第二次控制,從頭到倒數第二個
第三次控制,從頭到倒數第三個
....
因為后面都是排序好的
通過控制 while( tail == head->next ) 來判斷全部排序結束
這僅僅是一種辦法。代碼會比較麻煩。 但是如果節點資料結構復雜度話, 這個方法效率會很高,比交換資料要高。
uj5u.com熱心網友回復:
#include <stdio.h>#include <string>
#include <ctime>
typedef struct People {
char name[20];
char id[20];
struct People * next;
} People;
People * create(int n) {
if ( n<1 ) return NULL;
int i; int v;
v = rand() % 1000;
People * pHead = (People*) malloc( sizeof(People));
sprintf(pHead->name, "name-%03d", v);
sprintf(pHead->id, "id-%03d", v);
People * p = pHead;
for ( i=1; i<n; i++) {
p->next = (People*) malloc( sizeof(People));
v = rand() % 1000;
sprintf(p->next->name, "name-%d", v);
sprintf(p->next->id, "id-%03d", v);
p = p->next;
}
p->next = NULL;
return pHead;
};
void printList(People * pHead) {
printf("\n--------- People List ---------\n");
if ( pHead == NULL) return;
People * p = pHead;
while ( p ) {
printf("%s : %s\n", p->name, p->id);
p = p->next;
}
}
People * sortList(People * pHead) {
if ( NULL == pHead || pHead->next == NULL ) return pHead;
People * pTH = (People*) malloc( sizeof(People));
pTH->next = pHead;
People * pTail = NULL;
while ( pTH->next->next != pTail ) {
People * pPrior = pTH;
People * pCur = pTH->next;
People * pNext = pCur->next;
do {
if ( strcmp ( pCur->name, pNext->name)>0) {
pCur->next = pNext->next;
pNext->next = pCur;
pPrior->next = pNext;
People * pT = pNext;
pNext = pCur;
pCur = pT;
}
pNext = pNext->next;
pCur = pCur->next;
pPrior = pPrior->next;
} while( pNext!=pTail);
pTail = pCur;
}
pHead =pTH->next;
free(pTH);
return pHead;
};
int main()
{
srand(time(NULL));
People * p = create(10);
printList(p);
p = sortList(p);
printList(p);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/124515.html
標籤:C語言
