[Llink|data| Rlink]
【優點】
1. 雙向鏈結串列有兩個指標節點,在處理加入或刪除節點動作時,速度比較快。
2.若雙向鏈結串列有任一端的指標連結錯誤或脫落,它可以快速進行修補錯誤或脫落的連結節點。
【缺點】
1.由於雙向鏈結串列有兩個指標節點,所以比較浪費記憶體空間。
2.雙向鏈結串列的加入或刪除時,必須要有較多的連結節點。
由於懶得寫插入的就直接插入最後一筆,以後有時間再寫拉
目前只有 加入資料到最後一筆 跟 刪除最後一筆資料
以下是程式
struct list1
{
struct list1 *Llink;
int no;
char name[255];
struct list1 *Rlink;
};
struct list1 *head = NULL;//第一個位置
void free(void)//釋放
{
struct list1 *now = NULL;
struct list1 *buf = NULL;
now = head;
while(now != NULL)
{
buf = now;
now = now->Rlink;
free(buf);
}
}
void display(void)//顯示
{
struct list1 *now = NULL;
printf("*******************************\n");
now = head;
while(now != NULL)
{
printf("No. = %d, Name = %s\n", now->no, now->name);
now = now->Rlink;
}
printf("*******************************\n");
}
void AddData(void)
{
static struct list1 *Llink = NULL;
struct list1 *now = NULL;
char input[255];
int no;
printf("no. = ");
scanf("%d",&no);
printf("name = ");
scanf("%s",&input);
now = (struct list1 *)malloc(sizeof(struct list1)); //給新的位置
if (now == NULL) exit(EXIT_FAILURE);
now->no = no;//儲存nomber
strncpy(now->name, input, 254);//儲存name
now->name[255] = '\0';
now->Rlink = NULL;//下一個位置null
if (head == NULL) //第一筆資料
{
head = now;
head->Llink = NULL;
}
else
{
now->Llink = Llink;// now->Llink儲存上一筆的位置
Llink->Rlink = now;//上一筆資料的下一個位置 就是現在這個位置
}
Llink = now;//儲存目前的位置
}
void del(void)
{
struct list1 *now = NULL;
now = head;
if(now == NULL) return;
while(now->Rlink != NULL)
{
now = now->Rlink;
}
if(now->Llink == NULL)
{
head = NULL;
return;
}
now = now->Llink;
now->Rlink = NULL;//直接把最後第二個位置的Rlink拔掉 就等於把串列的資料給刪除掉
}
int main(void)
{
int select;
while(1)
{
printf("0.退出 1.增加資料到最後一筆 2.刪除最後一筆資料\n");
scanf("%d",&select);
if(select == 0)
{
break;
}
if(select == 1)
{
AddData();
}
if(select == 2)
{
del();
}
// display linked list
display();
printf("\n\n\n\n\n");
}
// display linked list
display();
// free linked list
free();
system("pause");
return 0;
}
測試數據
/*
1
1
qwe
1
2
asd
1
3
zxc
*/
留言列表