#include "stdio.h"
#include "stdlib.h"
#define N sizeof(struct node)
//連結清單結構體
typedef struct node{
struct node *next;
int data;
}*pnode;
//條件建立連結清單(頭插)
pnode create1(){
pnode head,p,q;
p=q=(pnode)malloc(N);
q=NULL;
scanf("%d",&p->data);
while(p->data!=0){
p->next=q;
q=p;
p=(pnode)malloc(N);
scanf("%d",&p->data);
}
head=q;
return head;
}
//條件建立連結清單(尾插)
pnode create2(){
pnode head,p,q;
p=q=(pnode)malloc(N);
head=NULL;
q->next=NULL;
scanf("%d",&p->data);
while(p->data!=0){
if(head==NULL)
head=p;
else
q->next=p;
q=p;
p=(pnode)malloc(N);
scanf("%d",&p->data);
}
q->next=NULL;
return head;
}
//連結清單的循環(頭插)
pnode precreate(int n){
pnode p,head,q;
q=(pnode)malloc(N);
q=NULL;
int i;
for(i=1;i<=n;i++)
{
p=(pnode)malloc(N);
scanf("%d",&p->data);
p->next=q;
q=p;
}
head=q;
return head;
}
//連結清單的循環(尾插)
pnode aftcreate(int n){
pnode head,p,q;
q=(pnode)malloc(N);
head=NULL;
int i;
for(i=1;i<=n;i++)
{
p=(pnode)malloc(N);
scanf("%d",&p->data);
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
//連結清單的插入節點
pnode insert(pnode head,int k){
pnode p,q;
p=q=(pnode)malloc(N);
p=head;
while(p->data!=k){
p=p->next;
}
if(p->data==k)
{
printf("請輸入你想插入的資料:\n");
scanf("%d",&q->data);
q->next=p->next;
p->next=q;
}
else
printf("連結清單中不存在這個數:\n");
return head;
}
//連結清單的修改節點
pnode alter(pnode head,int m)
{
pnode p;
p=(pnode)malloc(N);
p=head;
while(p->data!=m)
{
p=p->next;
}
if(p->data==m)
{
printf("請輸入你想修改為什麼數:\n");
scanf("%d",&p->data);
}
else
printf("連結清單中不存在這個資料!\n");
return head;
}
//連結清單之删除節點
pnode del(pnode head,int a)
{
pnode p,q;
p=q=(pnode)malloc(N);
p=head;
while(p->data!=a)
{
q=p;
p=p->next;
}
if(p->data==a)
{
q->next=p->next;
free(p);
}
else
printf("在連結清單中沒有找到這個資料!\n");
return head;
}
//連結清單之周遊節點
void show(pnode head)
{
pnode p;
p=(pnode)malloc(N);
p=head;
if(p==NULL)
printf("連結清單為空");
else
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//計算連結清單的節點
int sum(pnode head)
{
pnode p;
int j=0;
p=(pnode)malloc(N);
p=head;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}
int main()
{
pnode head;
int n,k,m,a,i;
do{
printf("********************************************\n");
printf("1.條件頭插建立連結清單輸入0結束\n2.條件尾插建立連結清單輸入0結束\n3,循環頭插建立連結清單\n4.循環尾插建立連結清單\n");
printf("5.插入節點\n6.修改節點\n7.删除節點\n8.周遊節點\n9.節點的計算\n10.退出程式\n");
printf("********************************************\n");
printf("請輸入你的選擇:\n");
scanf("%d",&i);
switch(i){
case 1:
printf("請輸入你想輸傳入連結表的資料:\n");
head=head=create1();
break;
case 2:
printf("請輸入你想輸傳入連結表的資料:\n");
head=create2();
break;
case 3:
printf("循環建立連結清單請輸入建立連結清單的節點數:\n");
scanf("%d",&n);
head=precreate(n);
break;
case 4:
printf("循環建立連結清單請輸入建立連結清單的節點數:\n");
scanf("%d",&n);
head=aftcreate(n);
break;
case 5:
printf("請輸入你想在那個資料後面插入資料;\n");
scanf("%d",&k);
insert(head,k);
break;
case 6:
printf("請輸入你想修改哪一個資料!\n");
scanf("%d",&m);
alter(head,m);
break;
case 7:
printf("請輸入你想删除的資料:\n");
scanf("%d",&a);
del(head,a);
break;
case 8:
show(head);
break;
case 9:
printf("連結清單的節點個數為%d\n",sum(head));
break;
case 10:
break;
}
}while(i!=10);
return 0;
}