1.編寫頭檔案
#include<stdio.h>
#include<stdlib.h>
#define
datatype
int
struct
node
{
num;
//編号
datatype
data;
//存儲的資料
node *pnext;
};
typedef
node;
//簡寫
//函數設計的思想
//改變一個變量需要變量的位址,改變指針需要指針的位址
//不用二級指針,必須要用傳回值指派
//增加,删除,查詢,修改,排序,逆轉
void
backaddnode(node
**ppnode,
num,
data);//增加節點
node *
backaddnodea(node
*pnode,
data);//
void
showallnode(node
*pnode);//顯示所有的節點
searchfirst(node
num);//查詢
change(node
oldnum,
newnum);//修改失敗傳回0,成功傳回1
rev(node
*pnode);//連結清單的逆轉
node * delete(node
num);//删除
insert(node
findnum,
newnum,
data);//實作插入,前面插入
sort(node
char
ch);//ch==> ch==<
2.編寫連結清單的實作代碼
#include
"linknode.h"
//增加節點
data)
//添加節點,需要先增加節點
node *pnewnode
= (node *)malloc(sizeof(node));
pnewnode->num
= num;
//指派
pnewnode->data
= data;
pnewnode->pnext
= null;//尾部
//如果連結清單為null
if (*ppnode
== null)
//存儲建立節點的位址
*ppnode =
pnewnode;
}
else
node *p
= *ppnode;//等于頭結點
while (p->pnext
!= null)
//一直循環到最後一個節點的位址
p =
p->pnext;
//表示尾部插入
p->pnext
= pnewnode;
//定義新節點
= num;
= null;
if (pnode
pnode =
//等于頭結點
= pnode;
//一直循環到最後一個節點的位址
//尾部插入
return
pnode;
//顯示所有的節點
*pnode)
printf("列印連結清單:\n");
while(p
printf("%p,%p,%d,%d\n",
p,
p->pnext,
p->num,
p->data);
//查詢
num)
//for循環
for (p
p !=
null;p=p->pnext)
if (num
== p->num)
//
傳回找到的位址
p;
break;
null;
//修改失敗傳回0,成功傳回1
newnum)
aaa:if
(pnode !=
null)
//查找
if (oldnum
== pnode->num)
pnode->num
= newnum;
return 1;
pnode->pnext;
goto
aaa;
return 0;
//連結清單的逆轉
node *p1,
*p2, *p3;
p1 =
p2 =
p3 =
null;//避免野指針
//表示為空連結清單或者隻有一個節點的情況下,直接傳回
== null ||
pnode->pnext
//傳回頭結點
//p2 == null時表示p1是最後一個節點了。
while (p2!=null)
//這裡p3相當于中間變量,用于儲存p2最開始的指向
p2->pnext;//布局第三個點
//将指針位址轉向
p2->pnext
= p1;
//循環向後移動
p2;
p3;
//将最開始的頭節點的next變成null
//改變頭節點位置,由最開始的位置變成最後節點
p1;
/************************************************************************/
/*
删除含有num的節點,删除節點的時候需要使用兩個節點,其中一個節點要儲存*/
要删除節點的上一個節點的位置
*/
node *p1
= null, *p2
//如果p1==null說明p2已經是最後節點
while (p1
if (p1->num
== num)
//p1儲存了要删除節點的位址,實際上p1就是要删除的那個節點
//p2儲存p1上一個節點的位置
p1->pnext;
//如果要删除的節點恰好是首節點
if (p1
== pnode)
//斷開與p1的關系,跳過了這個節點
//删除節點
free(p1);
//中間和末尾删除的情況
//這時候把p2代表的那個節點位址指向p1的下一個節點
= p1->pnext;
//因為首位址改變了,是以要傳回首位址的值
實作插入,前面插入 */
同樣要借助兩個節點,一個節點存儲查找到的目标節點,另外一個節點存儲
目标節點前的一個節點 */
*p2;
== findnum)
//p1儲存了要插入節點的位址
//p1是查找到的目标節點,p2儲存其上一個節點的位址
p1->pnext;
//先前循環
//生成節點
//表示找到的恰好是首節點
== p1)
//新節點的下一個節點是頭節點,這裡下面也可以換成p1
//這種方式表示的是頭節點
//将新節點的目标位址指向目标節點
//将p1的上一個節點的下一個的位址指派成新節點的位置
當傳遞'>'的時候表示的是降序排列 */
當傳遞'<'的時候表示的是升序排列 */
ch)
if (ch
== '<')
for (node
*p1 =
p1 !=
null;p1=p1->pnext)
*p2 =
p2 !=
null;p2=p2->pnext)
> p2->num)
//這裡的node作為中間變量
tnode;
tnode.num
= p1->num;
p1->num
= p2->num;
//交換資料
p2->num
= tnode.num;
//交換data資料
tnode.data
= p1->data;
p1->data
= p2->data;
p2->data
= tnode.data;
p1=p1->pnext)
null;p2
= p2->pnext)
< p2->num)
//作為中間變量
= tnode.num;
//交換data
tnode.data
3.編寫main.c測試編寫的連結清單
main(int
argc,char
*argv[])
//定義一個頭結點(這是最開始要做的)
node *pnode
//backaddnode(&pnode, 1, 1);
//backaddnode(&pnode, 2, 12);
//backaddnode(&pnode, 3, 14);
//showallnode(pnode);
backaddnodea(pnode,
1, 1);
//pnode = backaddnodea(pnode, 12, 11);
3, 111);
14, 1111);
5, 11111);
//pnode = backaddnodea(pnode, 16, 111111);
showallnode(pnode);
printf("改變參數\n");
change(pnode,
14, 141414);
//反轉
printf("反轉\n");
rev(pnode);
//删除
pnode = delete(pnode,1);
pnode = delete(pnode,
3);
//插入
insert(pnode,
3, 3, 333);
1, 13, 1333);
//排序
sort(pnode,
'<');
'>');
node *pfind
= searchfirst(pnode,
5);
if (pfind
printf("沒有找到");
printf("%p,%d,%d,%p\n",
pfind,
pfind->num,
pfind->data,
pfind->pnext);
getchar();