天天看點

C語言實作連結清單的頭插,尾插,插入,修改,删除和周遊

#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;

}

繼續閱讀