1. 程式人生 > >c語言有頭循環單鏈表

c語言有頭循環單鏈表

。。 creat != 姓名 single 創建 ++ clas 進行

/*************************************************************************
    > File Name: singleLineTable.c
    > Author: zshh0604
    > Mail: [email protected] 
    > Created Time: 2014年10月15日 星期三 11時34分08秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/***
 *   循環單鏈表。 
 *    
 *   學生結構體:
 *		id: 學生編號
 *		name:學生姓名
 *		math:分數
 *		next:指向下一個學生結構體
 */
typedef struct student {
	int id; 
	char name[20];
	int math;
	struct student * next;
}stu;


typedef int cmp_stu(const void * ,const void *);

/****
 *  函數功能:
 *		創建一個頭節點。

* 函數參數: * void. * 函數的返回值: * 返回頭節點指針。 */ stu * create(void) { stu *head = NULL; stu *p = NULL; stu *new = NULL; int tmpId = 0 ; char tmpName[20]; int tmpMath; head =(stu*) malloc(sizeof(stu)); if(head == NULL) { printf("分配stu地址空間失敗!。。\n"); return NULL; } head->id = 0; strncpy(head->name,"\0"); head->math = 0; // head->next = NULL; //單鏈表 head->next = head; //有頭循環單鏈表 p = head; //當頭創建出來之後應該將指針指向該頭部。 while(1) { new = (stu*) malloc(sizeof(stu)); if(new==NULL) { printf("malloc new error\n"); return NULL; } tmpId++; if(tmpId == 3) { break; } new->id = tmpId; printf("\nname="); scanf("%s",tmpName); strncpy(new->name,tmpName,20); printf("math="); scanf("%d",&tmpMath); new->math = tmpMath; p->next = new; p = new; //new ->next = NULL; //單鏈表 new->next = head; //有頭循環單鏈表 } return head; } /*** * 函數功能: * 打印輸出單鏈表中的數據。 * 函數參數: * head 是鏈表的頭。

* 返回值: * 沒有返回值 */ void printf_list(stu *head) { stu *tmp = NULL; int i = 0; if(head== NULL) { return; } tmp = head->next; #if 1 //有頭循環單鏈表 while(tmp!=head) { i++; printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); tmp = tmp->next; } #else while(tmp!=NULL) //單鏈表 { i++; printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); tmp = tmp->next; #endif printf("len = %d\n",i); } /***** * 函數功能: * 比較函數。 * 函數參數: * * 函數返回值: * 返回0表示成功。 * 返回1表示失敗?

* */ int cmp(const void * data, const void * key) { stu * head = NULL; int * tmpkey =NULL; head = (stu*) data; tmpkey=(int*)key; //printf("head->id = %d, tmpkey = %d",((stu*)data)->id, *tmpkey); if(head->id == *tmpkey) { return 0; } return 1; } /**** * * 函數功能: * 查找一個節點中的數據。

* 函數參數: * * 函數返回值: * 返回0查找成功,返回1查找失敗。 */ void * find_stu(stu* head,cmp_stu* cmps, const void *key) { stu * tmp = NULL; tmp = head->next; if(key == NULL) { return NULL; } #if 1 //循環單鏈表 if(cmps((const void *)head, (const void *)key) == 0) { printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); return tmp; } while(tmp != head) { if (cmps((const void *) tmp,(const void * )key)==0) { printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); return tmp; } tmp = tmp->next; } #else //單鏈表 while(tmp != NULL) { if (cmps((const void *) tmp,(const void * )key)==0) { printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); return tmp; } tmp = tmp->next; #endif return NULL; } /*** * 函數功能: * 插入節點。 * 函數參數: * head:鏈表中的節點。 * new:須要插入的節點。 * 函數的返回值: * 返回0表示插入成功。 * 返回1表示插入失敗。 */ int insert_tool(stu* head, stu* new) { if(head==NULL||new == NULL) { return 1; } #if 1 //循環單鏈表 if(head->next == head) { head->next = new; new->next = head; } #else //單鏈表 if(head->next == NULL) { head->next = new; new->next = NULL; } #endif new->next = head->next; head->next = new; return 0; } /*** * 函數功能: * 依據名稱進行比較。 * 函數參數: * data數據,key為要查數據中查找的值。 * 函數的返回值: * 返回0成功。

返回1失敗。 */ int cmp_name(const void *data, const void *key) { stu *tmp = NULL; char *tmpName = NULL; if(data== NULL || key == NULL) { return 1; } tmp =(stu *) data; tmpName =(char *) key; if(strncmp(tmp->name,tmpName, 20)==0) { return 0; } return 1; } /*** * * 函數功能: * 插入一個節點到鏈表中。 * 函數參數: * head:鏈表的頭節點。 * name :要查看的節點的名稱。 * 函數返回值: * 返回0插入成功。

* 返回1插入失敗。

*/ int insert_stu(stu* head,char *name) { stu * tmp = NULL; stu * new = NULL; char tmpName[20]; int tmpMath; tmp = (stu *)find_stu(head,cmp_name,name); if(tmp == NULL) { printf("沒有找到該同學\n"); return 1; } new = (stu*) malloc(sizeof(stu)); printf("name="); scanf("%s",tmpName); strncpy(new->name,tmpName,20); printf("math="); scanf("%d", &tmpMath); new->math = tmpMath; new->id = 10; insert_tool(tmp,new); return 0; } /** *函數功能: * 刪除制定的節點。 *參數: * head:鏈表的頭 * name:要刪除學生的名字。 *返回值。 * 0 返回成功。1返回失敗。 */ int delete_stu(stu * head,char *name) { stu * back = NULL; stu * p = NULL; p = head->next; #if 1 //循環單鏈表 if(strcmp(p->name,name)==0) { head->next = p->next; p->next = NULL; free(p); return 0; } while(p != head) { back = p; p = p->next; if(strcmp(p->name,name) == 0) { back->next = p->next; p->next = NULL; free(p); return 0; } } #else //單鏈表 while(p!=NULL) { back = p; p = p->next; if(strcmp(p->name,name) == 0) { back->next = p->next; p->next = NULL; free(p); return 0; } #endif return 1; } /*** * 函數功能: * 銷毀鏈表。 * 函數的參數: * 鏈表的頭。 * 函數的返回值 * 0表示返回成功。

1表示返回失敗。 */ int destory_list(stu* head) { stu *tmp; stu *p; p = head->next; while(p!=head) { tmp = p; p = p->next; tmp->next = NULL; printf("name = %s", tmp->name); free(tmp); } } int main(void) { int i = 2; stu * head = NULL; head = create(); printf_list(head); find_stu(head,cmp,&i); insert_stu(head,"bb"); printf_list(head); printf("----------------------\n"); destory_list(head); head = NULL; printf_list(head); printf("---------------------\n"); }


c語言有頭循環單鏈表