C語言之單迴圈連結串列
阿新 • • 發佈:2018-12-15
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
struct node *Init(struct node *head);
void Print_list(struct node *head);
struct node *insert(struct node *head,int i);
struct node *Delete(struct node *head,int i);
struct node *Delete(struct node *head,int i)
{
struct node *t,*s;
struct node *pr=head;
int j;
if(i==1)
{
for(t=pr;t->next!=pr;t=t->next); //找尾指標 //找到最後一個節點
s=pr; //刪除第一個節點意味著連線第二個節點
pr=pr->next; //找到指向第二個節點的指標
t->next=pr;
free(s);
return pr; //刪除第一個節點
}
else
{
t=pr;
for(j=1;j<i;j++) //找到要刪除的位置的前一個指標
{ //連線刪除位置後一個節點
t=t->next;
}
s=t->next;
t->next=s->next;
return pr;
}
} struct node *insert(struct node *head,int i)
{
int item;
int j;
struct node *s,*t;
struct node *pr=head; //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
//第二步:判斷傳入的連結串列是否為空
//第三步:為空 結束 無法插入;不為空,插入(迴圈的插入邏輯很簡單)
printf("輸入要插入的值\n");
scanf("%d",&item);
if(i==1)
{
s=(struct node *)malloc(sizeof(struct node)); //建立一個節點s
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=pr->next;
pr->next=s;
return pr;
}
else
{
t=pr;
for(j=1;j<i;j++)
{
t=t->next; //遍歷到要插入的位置,一般來說用迴圈次數來結束遍歷到了第幾個位置
}
s=(struct node *)malloc(sizeof(struct node));
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=t->next;
t->next=s;
return pr;
}
}
void Print_list(struct node *head)
{
struct node *p;
for(p=head->next;p!=head;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
} struct node *Init(struct node *head)
{
int item;
struct node *t;
struct node *s;
struct node *pr=head; //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
//第二步:判斷傳入的連結串列是否為空
//第三步:為空 一種初始化方式;不為空,另一種初始化方式(迴圈的建立邏輯很簡單)
while(1)
{
printf("輸入節點的值\n");
scanf("%d",&item);
fflush(stdin);
if(pr==NULL) //判斷為空表之後的操作
{
pr=(struct node *)malloc(sizeof(struct node)); //建立一個頭結點,然後使頭尾相接
if(pr==NULL)
{
printf("建立失敗\n");
exit(0);
}
pr->next=pr; //頭尾相接的操作
return pr;
}
else //如果不是空表 之後的操作 不是空表,自帶頭結點
{
for(t=pr;t->next!=pr;t=t->next); //用個迴圈找到尾結點,後面需要用尾結點操作
s=(struct node *)malloc(sizeof(struct node)); //建立一個節點 插入到頭節點和尾結點之間
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=pr;
t->next=s; //將s新節點插入到頭結點和尾節點之間的操作
return pr;
}
}
}
int main()
{
struct node *head=NULL;
int n,i;
while(n!=0)
{
printf("單迴圈連結串列的基本操作\n");
printf("-----------------------------");
printf("1.建立一個節點\n");
printf("2.插入節點\n");
printf("3.刪除節點\n");
printf("4.顯示連結串列成員\n");
printf("0.退出\n");
printf("請選擇操作\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
head=Init(head);
break;
}
case 2:
{
printf("插入的位置是\n");
scanf("%d",&i);
head=insert(head,i);
break;
}
case 3:
{
printf("刪除的位置是\n");
scanf("%d",&i);
head=Delete(head,i);
break;
}
case 4:
{
Print_list(head);
break;
}
}
}
return 0;
}
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
struct node *Init(struct node *head);
void Print_list(struct node *head);
struct node *insert(struct node *head,int i);
struct node *Delete(struct node *head,int i);
struct node *Delete(struct node *head,int i)
{
struct node *t,*s;
struct node *pr=head;
int j;
if(i==1)
{
for(t=pr;t->next!=pr;t=t->next); //找尾指標 //找到最後一個節點
s=pr; //刪除第一個節點意味著連線第二個節點
pr=pr->next; //找到指向第二個節點的指標
t->next=pr;
free(s);
return pr; //刪除第一個節點
}
else
{
t=pr;
for(j=1;j<i;j++) //找到要刪除的位置的前一個指標
{ //連線刪除位置後一個節點
t=t->next;
}
s=t->next;
t->next=s->next;
return pr;
}
} struct node *insert(struct node *head,int i)
{
int item;
int j;
struct node *s,*t;
struct node *pr=head; //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
//第二步:判斷傳入的連結串列是否為空
//第三步:為空 結束 無法插入;不為空,插入(迴圈的插入邏輯很簡單)
printf("輸入要插入的值\n");
scanf("%d",&item);
if(i==1)
{
s=(struct node *)malloc(sizeof(struct node)); //建立一個節點s
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=pr->next;
pr->next=s;
return pr;
}
else
{
t=pr;
for(j=1;j<i;j++)
{
t=t->next; //遍歷到要插入的位置,一般來說用迴圈次數來結束遍歷到了第幾個位置
}
s=(struct node *)malloc(sizeof(struct node));
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=t->next;
t->next=s;
return pr;
}
}
void Print_list(struct node *head)
{
struct node *p;
for(p=head->next;p!=head;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
} struct node *Init(struct node *head)
{
int item;
struct node *t;
struct node *s;
struct node *pr=head; //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
//第二步:判斷傳入的連結串列是否為空
//第三步:為空 一種初始化方式;不為空,另一種初始化方式(迴圈的建立邏輯很簡單)
while(1)
{
printf("輸入節點的值\n");
scanf("%d",&item);
fflush(stdin);
if(pr==NULL) //判斷為空表之後的操作
{
pr=(struct node *)malloc(sizeof(struct node)); //建立一個頭結點,然後使頭尾相接
if(pr==NULL)
{
printf("建立失敗\n");
exit(0);
}
pr->next=pr; //頭尾相接的操作
return pr;
}
else //如果不是空表 之後的操作 不是空表,自帶頭結點
{
for(t=pr;t->next!=pr;t=t->next); //用個迴圈找到尾結點,後面需要用尾結點操作
s=(struct node *)malloc(sizeof(struct node)); //建立一個節點 插入到頭節點和尾結點之間
if(s==NULL)
{
printf("建立失敗\n");
exit(0);
}
s->data=item;
s->next=pr;
t->next=s; //將s新節點插入到頭結點和尾節點之間的操作
return pr;
}
}
}
int main()
{
struct node *head=NULL;
int n,i;
while(n!=0)
{
printf("單迴圈連結串列的基本操作\n");
printf("-----------------------------");
printf("1.建立一個節點\n");
printf("2.插入節點\n");
printf("3.刪除節點\n");
printf("4.顯示連結串列成員\n");
printf("0.退出\n");
printf("請選擇操作\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
head=Init(head);
break;
}
case 2:
{
printf("插入的位置是\n");
scanf("%d",&i);
head=insert(head,i);
break;
}
case 3:
{
printf("刪除的位置是\n");
scanf("%d",&i);
head=Delete(head,i);
break;
}
case 4:
{
Print_list(head);
break;
}
}
}
return 0;
}