#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}Node;
Node* CreatList()//新建鏈表
{
int n,i;
scanf("%d",&n);
Node *head,*tail,*p;
head=tail=NULL;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(i=1;i<=n;i++)
{
p=(Node *)malloc(sizeof(Node));//在鏈表建立過程中,p總是不斷先接受系統動態分配的新結點地址
scanf("%d",&p->data);
p->next=NULL;//由於新增加的節點總是加在鏈表的末尾,所以該新節點的next域應置爲NULL
if(head==NULL)//建立鏈表的第一個節點時,整個鏈表是空的,這時p應該直接賦給head
head=p;
else
tail->next=p;//將原來鏈表的尾節點的next域指向該新增的節點
tail=p;//該新增節點成爲新的尾節點
}
return head;
}
void ShowList(Node *head)//遍歷鏈表
{
Node *ptr;
if(head!=NULL)
{
for(ptr=head;ptr!=NULL;ptr=ptr->next)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("%d ",ptr->data);
}
printf("\n");
}
Node *ReverseList(Node *head)//逆置列表
{
Node *p,*q;
p=head->next;
while(p)
{
q=p;
p=p->next;//p用來向後移動位置
q->next = head->next ;//利用head->next的空間作爲地址中轉站,令q->next指向上一個q所在的位置
if(q->next==q)//確保原來第二個節點指向原來的第一個節點
q->next=head;
head->next = q ;
}
head->next=NULL;
return q;
}
int main(void)
{
Node *phead;
phead = CreatList();
printf("鏈表逆置前的數據:\n");
ShowList(phead);
phead = ReverseList(phead);
printf("鏈表逆置後的數據:\n");
ShowList(phead);
return 0;
}
C // 單鏈表的創建、遍歷以及逆置操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.