链表
1、实现:创建、销毁、清空、追加、插入、删除、取元素、遍历,8个函数功能。
函数名可参考如下:
创建CreateList, 销毁DestroyList, 清空ClearList , 追加ListAppend,
插入ListInsert, 删除ListDelete, 取元素GetElement, 遍历TraverseList
注意:遍历TraverseList,使用函数指针做参数。
2、要求:
程序不能有错误和警告。
3、测试操作如下(必须按照下面步骤依次操作测试):
(1)操作内容:将字符串"have a dream?"中的字符依次追加到链表。
显示链表内容:have a dream?
(2)操作内容:将字符串"Zo!o u yDX"中的字符依次插入到链表的0,1,15,2,3,3,2,3,1,23位置中。
显示链表内容:Do you have a dream?!
(3)操作内容:依次删除链表的0,21,13,17,3,16,11,14,1,10,11,1,9,10位置数据。
显示链表内容:you have?
(4)操作内容:依次从链表的1,8,6,5,10位置中得到字符yeah,并显示字符。
显示得到结果:yeah
(5)操作内容:清空链表并显示链表内容
显示链表内容:
(6)操作内容:销毁链表
显示操作内容:DestroyList
typedef char EleType; typedef struct Node { EleType data; struct Node *next; } ChainNode; typedef struct { ChainNode *head; } List ; List *CreateList(); void ListDestroy(List *lp); void ListClear(List *lp); int ListAppend(List *lp , EleType data); int ListInsert(List *lp, int n , EleType data); int ListDelete(List *lp , int n); int GetElement(List *lp , int n ,EleType *data); ChainNode *GetAddr(List *lp , int n); ChainNode *NewChainNode(EleType data); int TraverseList(List *lp , int (*f)(EleType *)); List *CreateList() { List *lp; lp = (List *)malloc(sizeof(List)); if(!lp) return 0; lp ->head = NewChainNode(0); if(!lp -> head) { free(lp); return 0; } return lp; } void ListDestroy(List *lp) { ListClear(lp); free(lp->head); free(lp); printf("DestroyList\n"); } void ListClear(List *lp) { while(ListDelete(lp,1)); } int ListAppend(List *lp , EleType data) { ChainNode *newp , *p; newp = NewChainNode(data); if(!newp ) return 0; for(p =lp->head;p->next;p =p->next); p->next = newp; return 1; } int ListInsert(List *lp, int n , EleType data) { ChainNode *newp , *p; if(n<1) return 0; newp = NewChainNode(data); if(!newp ) return 0; p = GetAddr(lp,n-1); if(!p ) return 0; newp ->next = p->next; p ->next = newp ; return 1; } int ListDelete(List *lp , int n) { ChainNode *p , *pr; if(n<1) return 0; p = GetAddr(lp , n-1); if(!(p&&p->next)) return 0; pr =p->next; p->next = pr->next; free(pr); return 1; } int GetElement(List *lp , int n ,EleType *data) { ChainNode *p ; if(n<1) return 0; p = GetAddr(lp , n); if(!p) return 0; *data = p ->data ; return 1; } ChainNode *GetAddr(List *lp , int n) { int count = 0; ChainNode *p; for(p = lp->head;p&&count < n; p=p->next) { count ++; } if(!p) return 0; return p; } ChainNode *NewChainNode(EleType data) { ChainNode *newp; newp = (ChainNode *)malloc(sizeof(ChainNode)); if(!newp ) return 0; newp -> data = data; newp -> next = 0; return newp; } int TraverseList(List *lp , int (*f)(EleType *)) { int count = 1; ChainNode *p; for(p =lp->head->next;p;p=p->next) { if(!f(&p->data)) return count ; count ++; } printf("\n"); return 0; } int show(EleType *data) { printf("%c",*data); } main() { List *lp; int n ,Inaddr[10] = {0,1,15,2,3,3,2,3,1,23}; int Deladdr[14]= {0,21,13,17,3,16,11,14,1,10,11,1,9,10}; int gete[5] = {1,8,6,5,10}; char getE[5] , In[15] = {'Z','o','!','o',' ','u',' ', 'y','D','X'}; char s[30] = "have a dream"; lp = CreateList(); for(n=0;s[n];n ++) { ListAppend(lp,s[n]); } TraverseList(lp , show); for(n=0;n<10;n++) { ListInsert(lp,Inaddr[n],In[n]); } TraverseList(lp , show); for(n=0;n<14;n++) { ListDelete(lp ,Deladdr[n]); } TraverseList(lp , show); for(n= 0;n<5;n++) { GetElement(lp,gete[n],getE+n); printf("%c",getE[n]); getE[n+1] = ' '; } printf("\n"); ListClear(lp); TraverseList(lp,show); ListDestroy(lp); }