print?/*鏈表*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_SUCCESS 0
#define LIST_ERROR -1
typedef struct student
{
char name[20];
int chinese;//語文成績
int math;//數學成績
struct student* next;
}STU;
//初始化list,第一個節點不用來存放數據
int init_list(STU** head)
{
if( NULL!=*head )
{
printf("鏈表初始化錯誤!/n");
return LIST_ERROR;
}
*head=(STU*)malloc(sizeof(STU));
if( NULL==*head )
{
printf("分配空間出錯!/n");
return LIST_ERROR;
}
(*head)->next=NULL;
printf("初始化完畢!/n");
return LIST_SUCCESS;
}
//向list策插入節點元素
int insert_node(STU* stu, STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法插入節點!/n");
return LIST_ERROR;
}
while(NULL!=head->next)
{
head=head->next;
}
head->next=(STU*)malloc(sizeof(STU));
if( NULL==head )
{
printf("分配內存錯誤!/n");
return LIST_ERROR;
}
head=head->next;
strncpy(head->name, stu->name, 20);
head->chinese=stu->chinese;
head->math=stu->math;
head->next=NULL;
printf("插入節點成功!/n");
return LIST_SUCCESS;
}
//按數學成績遞增的順序插入節點元素
int insert_node_sorted(STU* stu, STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法插入節點!/n");
return LIST_ERROR;
}
STU* pPre=head;
STU* pCur=pPre->next;
STU* new=(STU*)malloc(sizeof(STU));
strncpy(new->name, stu->name, 20);
new->chinese=stu->chinese;
new->math=stu->math;
while(NULL!=pCur)
{
if( new->math>=pCur->math )
{
pPre->next=new;
new->next=pCur;
return LIST_SUCCESS;
}
pPre=pCur;
pCur=pCur->next;
}
pPre->next=new;
new->next=NULL;
return LIST_SUCCESS;
}
//刪除節點,以學生名字匹配
int remove_node(const char* name, STU* head)
{
STU* temp;
if( NULL==head )
{
printf("鏈表還沒有初始化,無法刪除節點!/n");
return LIST_ERROR;
}
while( NULL!=head->next )
{
if( 0==strcmp(head->next->name, name) )
{
temp=head->next;
head->next=head->next->next;
free(temp);
printf("刪除節點成功!/n");
return LIST_SUCCESS;
}
head=head->next;
}
printf("沒有找到要刪除的節點!/n");
return LIST_ERROR;
}
//遍歷鏈表,返回匹配到的節點
STU* travel_list(const char* name, STU*head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法遍歷鏈表!/n");
return NULL;
}
while( NULL!=head->next )
{
if( 0==strcmp(head->next->name, name) )
{
return head->next;
}
head=head->next;
}
return NULL;
}
int delete_list(STU** head)
{
STU* tmp;
while( NULL!=*head )
{
tmp=*head;
*head=(*head)->next;
free(tmp);
}
printf("刪除鏈表成功!/n");
return LIST_SUCCESS;
}
int display_list(STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法打印節點信息!/n");
return LIST_ERROR;
}
if( NULL==head->next )
{
printf("鏈表為空,無法打印節點信息!/n");
return LIST_ERROR;
}
while( NULL!=head->next )
{
printf("------------------------------>/n");
printf("%s %-4d%-4d/n", head->next->name, head->next->chinese, head->next->math);
head=head->next;
}
return LIST_ERROR;
}
int invert_list(STU* head)
{
STU* pPre;
STU* pCur;
STU* pNext;
if( NULL==head->next || NULL==head || NULL==head->next->next)
{
printf("無法逆置鏈表!/n");
return LIST_ERROR;
}
pCur=head->next;
pNext=pCur->next;
pCur->next=NULL;
pPre=pCur;
pCur=pNext;
while( NULL!=pCur )
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
head->next=pPre;
return LIST_SUCCESS;
}
int main(int argc, char *argv[])
{
int Quite=0;
int choice;
char name[20];
STU* pHead=NULL;
STU stu;
STU* pstu=NULL;
while(1)
{
printf("****************************************/n");
printf("1、初始化鏈表請輸入 1/n");
printf("2、插入節點請輸入 2/n");
printf("3、刪除節點請輸入 3/n");
printf("4、查找節點請輸入 4/n");
printf("5、刪除鏈表請輸入 5/n");
printf("6、逆置鏈表請輸入 6/n");
printf("6、退出請輸入 7/n");
printf("****************************************/n");
scanf("%d", &choice);
switch ( choice )
{
case 1 :
init_list(&pHead);
break;
case 2 :
printf("請輸入學生的姓名、語文成績、數學成績:/n");
scanf("%s%d%d", stu.name, &stu.chinese, &stu.math);
insert_node_sorted(&stu, pHead);
printf("插入節點後鏈表的內容為:/n");
display_list(pHead);
break;
case 3:
printf("請輸入你要刪除節點的學生的名字:/n");
scanf("%s", name);
remove_node(name, pHead);
printf("刪除節點後,鏈表的內容為:/n");
display_list(pHead);
break;
case 4:
printf("請輸入你要查找節點的學生的名字:/n");
scanf("%s", name);
pstu=travel_list(name, pHead);
if( NULL==pstu )
{
printf("沒有查到你所需要的信息!/n");
}
else
{
printf("你所查學生的信息為:/n");
printf("%s %-4d%-4d/n", pstu->name, pstu->chinese, pstu->math);
}
break;
case 5:
delete_list(&pHead);
break;
case 6:
printf("逆置前鏈表內容為:/n");
display_list(pHead);
if(LIST_SUCCESS==invert_list(pHead))
{
printf("逆置後鏈表內容為:/n");
display_list(pHead);
}
break;
case 7:
Quite=1;
break;
default :
break;
}
if( 1==Quite )
{
break;
}
}
return 0;
}
/*鏈表*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_SUCCESS 0
#define LIST_ERROR -1
typedef struct student
{
char name[20];
int chinese;//語文成績
int math;//數學成績
struct student* next;
}STU;
//初始化list,第一個節點不用來存放數據
int init_list(STU** head)
{
if( NULL!=*head )
{
printf("鏈表初始化錯誤!/n");
return LIST_ERROR;
}
*head=(STU*)malloc(sizeof(STU));
if( NULL==*head )
{
printf("分配空間出錯!/n");
return LIST_ERROR;
}
(*head)->next=NULL;
printf("初始化完畢!/n");
return LIST_SUCCESS;
}
//向list策插入節點元素
int insert_node(STU* stu, STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法插入節點!/n");
return LIST_ERROR;
}
while(NULL!=head->next)
{
head=head->next;
}
head->next=(STU*)malloc(sizeof(STU));
if( NULL==head )
{
printf("分配內存錯誤!/n");
return LIST_ERROR;
}
head=head->next;
strncpy(head->name, stu->name, 20);
head->chinese=stu->chinese;
head->math=stu->math;
head->next=NULL;
printf("插入節點成功!/n");
return LIST_SUCCESS;
}
//按數學成績遞增的順序插入節點元素
int insert_node_sorted(STU* stu, STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法插入節點!/n");
return LIST_ERROR;
}
STU* pPre=head;
STU* pCur=pPre->next;
STU* new=(STU*)malloc(sizeof(STU));
strncpy(new->name, stu->name, 20);
new->chinese=stu->chinese;
new->math=stu->math;
while(NULL!=pCur)
{
if( new->math>=pCur->math )
{
pPre->next=new;
new->next=pCur;
return LIST_SUCCESS;
}
pPre=pCur;
pCur=pCur->next;
}
pPre->next=new;
new->next=NULL;
return LIST_SUCCESS;
}
//刪除節點,以學生名字匹配
int remove_node(const char* name, STU* head)
{
STU* temp;
if( NULL==head )
{
printf("鏈表還沒有初始化,無法刪除節點!/n");
return LIST_ERROR;
}
while( NULL!=head->next )
{
if( 0==strcmp(head->next->name, name) )
{
temp=head->next;
head->next=head->next->next;
free(temp);
printf("刪除節點成功!/n");
return LIST_SUCCESS;
}
head=head->next;
}
printf("沒有找到要刪除的節點!/n");
return LIST_ERROR;
}
//遍歷鏈表,返回匹配到的節點
STU* travel_list(const char* name, STU*head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法遍歷鏈表!/n");
return NULL;
}
while( NULL!=head->next )
{
if( 0==strcmp(head->next->name, name) )
{
return head->next;
}
head=head->next;
}
return NULL;
}
int delete_list(STU** head)
{
STU* tmp;
while( NULL!=*head )
{
tmp=*head;
*head=(*head)->next;
free(tmp);
}
printf("刪除鏈表成功!/n");
return LIST_SUCCESS;
}
int display_list(STU* head)
{
if( NULL==head )
{
printf("鏈表還沒有初始化,無法打印節點信息!/n");
return LIST_ERROR;
}
if( NULL==head->next )
{
printf("鏈表為空,無法打印節點信息!/n");
return LIST_ERROR;
}
while( NULL!=head->next )
{
printf("------------------------------>/n");
printf("%s %-4d%-4d/n", head->next->name, head->next->chinese, head->next->math);
head=head->next;
}
return LIST_ERROR;
}
int invert_list(STU* head)
{
STU* pPre;
STU* pCur;
STU* pNext;
if( NULL==head->next || NULL==head || NULL==head->next->next)
{
printf("無法逆置鏈表!/n");
return LIST_ERROR;
}
pCur=head->next;
pNext=pCur->next;
pCur->next=NULL;
pPre=pCur;
pCur=pNext;
while( NULL!=pCur )
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
head->next=pPre;
return LIST_SUCCESS;
}
int main(int argc, char *argv[])
{
int Quite=0;
int choice;
char name[20];
STU* pHead=NULL;
STU stu;
STU* pstu=NULL;
while(1)
{
printf("****************************************/n");
printf("1、初始化鏈表請輸入 1/n");
printf("2、插入節點請輸入 2/n");
printf("3、刪除節點請輸入 3/n");
printf("4、查找節點請輸入 4/n");
printf("5、刪除鏈表請輸入 5/n");
printf("6、逆置鏈表請輸入 6/n");
printf("6、退出請輸入 7/n");
printf("****************************************/n");
scanf("%d", &choice);
switch ( choice )
{
case 1 :
init_list(&pHead);
break;
case 2 :
printf("請輸入學生的姓名、語文成績、數學成績:/n");
scanf("%s%d%d", stu.name, &stu.chinese, &stu.math);
insert_node_sorted(&stu, pHead);
printf("插入節點後鏈表的內容為:/n");
display_list(pHead);
break;
case 3:
printf("請輸入你要刪除節點的學生的名字:/n");
scanf("%s", name);
remove_node(name, pHead);
printf("刪除節點後,鏈表的內容為:/n");
display_list(pHead);
break;
case 4:
printf("請輸入你要查找節點的學生的名字:/n");
scanf("%s", name);
pstu=travel_list(name, pHead);
if( NULL==pstu )
{
printf("沒有查到你所需要的信息!/n");
}
else
{
printf("你所查學生的信息為:/n");
printf("%s %-4d%-4d/n", pstu->name, pstu->chinese, pstu->math);
}
break;
case 5:
delete_list(&pHead);
break;
case 6:
printf("逆置前鏈表內容為:/n");
display_list(pHead);
if(LIST_SUCCESS==invert_list(pHead))
{
printf("逆置後鏈表內容為:/n");
display_list(pHead);
}
break;
case 7:
Quite=1;
break;
default :
break;
}
if( 1==Quite )
{
break;
}
}
return 0;
}