1.创建:通过头尾指针创建一个单向链表 2.输出 3.倒序输出:递归 4.转置:用三个指针,一个被指向p1,一个指向p2,一个断开p3
代码实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int nValue; struct node* pNext; }List; //创建 List* CreateList() { printf("请输入节点个数:\n"); int num; scanf("%d",&num); List* pHead = NULL; List* pEnd = NULL; List* pTemp = NULL; int Value=0; printf("请输入节点内容:\n"); while(num) {
//printf("请输入节点内容:\n"); scanf("%d",&Value); //创建节点 pTemp = (List*)malloc(sizeof(List)); pTemp->nValue=Value; pTemp->pNext=NULL; if(pHead == NULL) { pHead = pTemp; } else//尾的下一个等于temp { pEnd->pNext = pTemp; } //尾移动到下一个 pEnd = pTemp; num--; } return pHead; } //输出 void PrintfList(List* pHead) { if(pHead == NULL) return; printf("输出值:"); List* pTemp = pHead; while(pTemp) { printf("%d",pTemp->nValue); pTemp=pTemp->pNext; } } //反向输出 void reversePrintf(List* pHead) { //递归 if(pHead == NULL) return; reversePrintf(pHead->pNext); printf("%d",pHead->nValue); } //转置 List* ReverseList(List* pHead) { if(pHead == NULL || pHead->pNext == NULL) return pHead; //三个指针一起移动 List* p1=NULL;//被指向(头->pNext) List* p2=NULL;//指向(头) List* p3=NULL;//断开 p2=pHead; p3=pHead->pNext; while(p3 != NULL) { p2->pNext = p1;
p1=p2; p2=p3; p3=p3->pNext;//为空说明到pEnd->pNext } p2->pNext = p1; // 最后还需要把p2和p1连起来,此时p2指向pEnd,但是与p1为连接 return p2; } int main() { List* list = CreateList(); PrintfList(list); printf("\n"); reversePrintf(list); printf("\n"); list=ReverseList(list); printf("\n"); PrintfList(list);
return 0; }
