纯代码,给学弟解决的一道问题
#include <stdio.h>
#include <stdlib.h>
struct llist
{
int num;
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
//链表的输出 这道题目是用来abcde,你输入e,输出eabcd;你输入d,输出deabc
void printllist(llink ptr)
{
while ( ptr != NULL )
{
printf("[%d]",ptr->num);
ptr = ptr->next;
}
printf("\n");
}
//链表的建立
llink createllist(int *array,int len)
{
llink head; /* 链表的开始指针 */
llink ptr,ptr1;
int i;
/* 建立第一个节点 */
head = ( llink ) malloc(sizeof(node)); /* 分配内存*/
if ( !head )
return NULL;
head->num = array[0];
head->next = NULL;
ptr = head;
for ( i = 1; i < len; i++ )
{
ptr1 = ( llink ) malloc(sizeof(node));
if ( !ptr1 )
return NULL;
ptr1->num = array[i]; /* 建立节点内容 */
ptr1->next = NULL; /* 设定指针初值 */
ptr->next = ptr1; /* 连结节点 */
ptr = ptr->next; /* 指向下一节点 */
}
return head;
}
//链表的结点遍历
llink findnode(llink head,int num)
{
llink ptr=NULL;
ptr = head;
while ( ptr != NULL )
{
if ( ptr->num == num )
return ptr;
ptr = ptr->next;
}
return ptr;
}
//链表的前一个结点寻找
llink findPreNode(llink head,llink ptr)
{
llink pre;//前结点
pre=head;
if(ptr==head)//第一结点
{
return ptr;
}
while(pre->next !=ptr)
{
pre=pre->next;
}
return pre;
}
//链表的内存释放
void freellist(llink head)
{
llink ptr;
while ( head != NULL )
{
ptr = head;
head = head->next; /* 指向下一节点 */
free(ptr);
}
}
//改变链表指向
llink changenode(llink head,llink ptr,llink pre)
{
if(ptr==head)//第一结点
{
return head;
}
pre->next=ptr->next;
ptr->next=head;
//head->next=ptr;
head=ptr;
return head;
}
int main(int argc, char *argv[])
{
int llist1[6] = { 1, 2, 3, 4, 5, 6 };
llink head;
llink ptr;
int num;
int value;
head = createllist(llist1,6);
if ( !head )
{
printf("内存分配失败! \n");
exit(1);
}
printf("原来的链表: ");
printllist(head);
while ( 1 )
{
printf("输入你要排在前面的字符==> ");
scanf("%d",&num);
ptr=findnode(head,num);
if(ptr==NULL)
{
printf("不存在你输入的字符\n");
}
else
{
llink pre=findPreNode(head,ptr);
//printf("%d",pre->num);
head=changenode(head,ptr,pre);
printllist(head);
}
}
freellist(head);
system("PAUSE");
return 0;
}
#include <stdlib.h>
struct llist
{
int num;
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
//链表的输出 这道题目是用来abcde,你输入e,输出eabcd;你输入d,输出deabc
void printllist(llink ptr)
{
while ( ptr != NULL )
{
printf("[%d]",ptr->num);
ptr = ptr->next;
}
printf("\n");
}
//链表的建立
llink createllist(int *array,int len)
{
llink head; /* 链表的开始指针 */
llink ptr,ptr1;
int i;
/* 建立第一个节点 */
head = ( llink ) malloc(sizeof(node)); /* 分配内存*/
if ( !head )
return NULL;
head->num = array[0];
head->next = NULL;
ptr = head;
for ( i = 1; i < len; i++ )
{
ptr1 = ( llink ) malloc(sizeof(node));
if ( !ptr1 )
return NULL;
ptr1->num = array[i]; /* 建立节点内容 */
ptr1->next = NULL; /* 设定指针初值 */
ptr->next = ptr1; /* 连结节点 */
ptr = ptr->next; /* 指向下一节点 */
}
return head;
}
//链表的结点遍历
llink findnode(llink head,int num)
{
llink ptr=NULL;
ptr = head;
while ( ptr != NULL )
{
if ( ptr->num == num )
return ptr;
ptr = ptr->next;
}
return ptr;
}
//链表的前一个结点寻找
llink findPreNode(llink head,llink ptr)
{
llink pre;//前结点
pre=head;
if(ptr==head)//第一结点
{
return ptr;
}
while(pre->next !=ptr)
{
pre=pre->next;
}
return pre;
}
//链表的内存释放
void freellist(llink head)
{
llink ptr;
while ( head != NULL )
{
ptr = head;
head = head->next; /* 指向下一节点 */
free(ptr);
}
}
//改变链表指向
llink changenode(llink head,llink ptr,llink pre)
{
if(ptr==head)//第一结点
{
return head;
}
pre->next=ptr->next;
ptr->next=head;
//head->next=ptr;
head=ptr;
return head;
}
int main(int argc, char *argv[])
{
int llist1[6] = { 1, 2, 3, 4, 5, 6 };
llink head;
llink ptr;
int num;
int value;
head = createllist(llist1,6);
if ( !head )
{
printf("内存分配失败! \n");
exit(1);
}
printf("原来的链表: ");
printllist(head);
while ( 1 )
{
printf("输入你要排在前面的字符==> ");
scanf("%d",&num);
ptr=findnode(head,num);
if(ptr==NULL)
{
printf("不存在你输入的字符\n");
}
else
{
llink pre=findPreNode(head,ptr);
//printf("%d",pre->num);
head=changenode(head,ptr,pre);
printllist(head);
}
}
freellist(head);
system("PAUSE");
return 0;
}
合乎自然而生生不息。。。