【資料結構】線性表的鏈式儲存(二)迴圈連結串列
阿新 • • 發佈:2018-12-10
線性錶鏈式儲存的迴圈單鏈表
- 迴圈連結串列從任意一點出發,可以訪問全部節點。
- 一般為了便於操作,將連結串列的頭指標變為尾指標,指向尾節點,連結串列的頭節點則為尾指標的next。
程式碼收穫
- 用尾指標進行操作雖然省下迴圈,但是插入刪除等操作都需要移動尾指標導致必須傳入尾指標的地址進行操作。
線性表歸檔
# include <stdio.h>
# include <stdlib.h>
typedef struct Node{
char data;
struct Node *next;
}Node,*Nodep;
//初始化,一開始尾指標指向尾節點即為頭節點 ,自己指向自己
void Initiallist(Nodep* rear){
*rear = (Nodep)malloc(sizeof(Node));
(*rear)->next = *rear;
}
//插入資料 頭插法,尾節要變為第一個節點位置,所以必須傳地址,資料插入頭節點之後
void InsertData(Nodep* prear){
printf("輸入插入的資料,按$停止\n");
char c;
int flag=1;
Nodep head;
head = (*prear)->next;
while(flag){
c = getchar();
if (c!='$'){
Nodep newnode;
newnode = (Nodep)malloc(sizeof(Node));
newnode->data=c;
if(*prear==(*prear)->next){//第一個節點,不是第一個插入的節點尾指標不會等於頭指標
*prear=newnode;//頭插法導致需要把尾指標第一次插入時移向第一個插入的節點
newnode->next = head;
}else{
newnode->next=head->next;
}
head->next=newnode;
} else{
flag=0;
}
}
}
//尾插法 尾指標不斷後移 要傳地址
void TailInsert(Nodep* prear){
Nodep head;
head = (*prear)->next;
printf("\n輸入插入的元素,按$結束\n");
int flag = 1;
while(flag){
char c;
c = getchar();
if(c!='$'){
Nodep newnode;
newnode = (Nodep)malloc(sizeof(Node));
newnode->data = c;
(*prear)->next=newnode;
newnode->next=head;
(*prear)=newnode;
}else{
flag=0;
}
}
}
//刪除指定索引元素 若刪除尾節點,則需要移動尾指標,所以傳地址
int DeleteIndex(Nodep* prear){
int num;
printf("輸入刪除的元素索引\n");
scanf("%d",&num);
int k;
Nodep pp,pre;
if(num<=0){
printf("位置錯誤\n");
return 1;
}else{
pre = (*prear)->next;
for(k=1,pp=(*prear)->next->next;k<num;k++){
if (pp!=(*prear)->next){
pre = pp;
pp=pp->next;
}else{
printf("位置過大\n");
return 1;
}
}
if(pp==*prear){
*prear = pre;
pre->next=pp->next;
free(pp);
}else{
pre->next = pp->next;
free(pp);
}
}return 0;
}
//刪除找到的第一個元素
int DeleteChar(Nodep* prear){
printf("輸入要刪除的元素\n");
char goal;
scanf("%c",&goal);
Nodep pp,pre;
pp = (*prear)->next->next;
pre=(*prear)->next;
while(goal!=pp->data){
if (pp==(*prear)->next){
printf("沒找到資料\n");
return 1;
}else{
pre = pp;
pp =pp->next;
}
}
if(pp==(*prear)){
(*prear)=pre;
pre->next = pp->next;
free(pp);
}else{
pre->next=pp->next;
free(pp);
}return 0;
}
void Printlist(Nodep rear){//列印連結串列
Nodep pp;
Nodep head;
head = rear->next;
pp = head->next;
printf("連結串列為\n");
while(pp!=head){
printf("%c",pp->data);
pp=pp->next;
}
printf("\n");
}
void main(){
Nodep rear;
Initiallist(&rear);
InsertData(&rear);
getchar();
Printlist(rear);
TailInsert(&rear);
getchar();
Printlist(rear);
DeleteIndex(&rear);
getchar();
Printlist(rear);
DeleteChar(&rear);
getchar();
Printlist(rear);
}