寫一個鏈表的的操作的例子,雖然沒什麼難度,但是好久沒寫了,練練手。
typedef struct tagLinkNode //定義一個節點結構體
{
char m_type;
struct tagLinkNode *next;
}LinkNode;
LinkNode* CreatLinkList(int n) //創建鏈表的函數
{
//L爲指向頭節點的指針
LinkNode* L, *ptr, *p; //p爲指向新申請內存空間的節點
//ptr爲插入前驅節點
int i;
L = (LinkNode*)malloc(sizeof(LinkNode)); //申請頭節點,並用L指向它
L->next = NULL; //初始化頭節點的next域
L->m_type = '0'; //將頭節點的m_type域設置爲'0'
//以作爲標記
ptr = L; //初始化前驅指針
printf("輸入字母(每個字母以回車鍵作爲結束): ");
for(i = 0; i < n; i++) //依次創建節點
{
p = (LinkNode*)malloc(sizeof(LinkNode));
if(p == NULL)
{
printf("malloc error!");
}
scanf("%c", &(p->m_type));
fflush(stdin); //刷新stdin
p->next = ptr->next; //插入一個節點的算法
ptr->next = p;
ptr = p;
}
return L; //返回指向頭節點的指針
}
LinkNode* RotateList(LinkNode* Head) //鏈表倒轉函數
{
LinkNode *p1, *p2; //p2爲遊標指針
LinkNode *L = Head;
p1 = Head;
p2 = Head->next;
while(p2) //順次從鏈表中拿下一個節點然後分別插入到前面
{
p1->next = p2->next;
p2->next = L;
L = p2;
p2 = p1->next;
}
return L; //返回新的頭指針
}
void PrintLinkList(LinkNode* Head) //輸出鏈表的函數
{
LinkNode *p = Head;
if(p->m_type != '0') //這是倒轉後的輸出
{
printf(" 倒轉後爲: ");
while(p->m_type != '0') //當遇到頭節點時停止輸出
{
printf("%c ",p->m_type);
p = p->next;
}
}
else //這是倒轉前的輸出
{
printf(" 顯示輸出爲: ");
p = p->next; //跳過頭節點
while(p)
{
printf("%c ",p->m_type);
p = p->next;
}
}
}
int main()
{
int n = 5;
LinkNode *head; //定義一個表頭指針
head = CreatLinkList(n); //創建鏈表
PrintLinkList(head); //打印輸出
head = RotateList(head); //倒轉鏈表
PrintLinkList(head); //打印輸出
}