C单链表实现

时间:2023-03-09 17:23:28
C单链表实现

 /*
* LinkNode.c
*
* Created on: Jan 14, 2014
* Author: root
*/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
char *data;
struct node *next;
}Node,*pNode; pNode create();
void printList(pNode pHead);
int InsertNode(pNode pHead,int front,char *data);
char* DeleteNode(pNode pHead,int pos);
int LengthList(pNode pHead);
void Sort_List(pNode pHead);
pNode Reverse_List(pNode pHead);
int main()
{ pNode pHead = NULL;
int front;
int choose;
char* return_val=NULL;
pHead=create();
printf("你输入的数据是,\n");
int length;
length = LengthList(pHead);
printf("(长度为%d的单链表):\n",length);
printList(pHead);
while()
{
printf("是否还要进行如下操作:\n");
printf("1.插入数据 2.删除数据 3.修改数据 4.链表排序 5.链表逆序 6.退出\n");
scanf("%d",&choose);
if(choose!=&&choose!=&&choose!=&&choose!=&&choose!=)
{
printf("error:请输入正确的数字!\n");
break;
}
switch(choose)
{
case :
{
printf("请输入要在第几个节点前插入数据:");
scanf("%d",&front);
if(front>length)
{
front = length;
printf("Warning:输入结点位置大于链表长度,默认在表尾部添加!\n");
}
printf("请输入要插入的数据:");
char *data = (char*)malloc(sizeof(char*));
scanf("%s",data);
if(InsertNode(pHead,front,data)==)
{
printf("插入成功\n插入后的数据是:\n");
printList(pHead);
}else
{
printf("插入失败\n");
}
break;
}
case :
{
printf("请输入要删除第几个节点的数据:");
scanf("%d",&front);
if(front>length)
{
front=length;
printf("Warning:输入结点位置大于链表长度,默认删除表最后一个结点!\n");
}
return_val = DeleteNode(pHead,front);
if(return_val==NULL)
{
printf("删除失败。\n");
}else
{
printf("删除成功。删除的元素是:%s\n",return_val);
}
printf("操作完成后的数据是:\n");
printList(pHead);
break;
}
case :
{
printf("暂时没有做这个功能!\n");
break;
}
case :
{
Sort_List(pHead);
break;
}
case :
{
Reverse_List(pHead);
break;
}
case :
{
exit();
}
return ;
} } return ;
} pNode create()
{
int i;
int len;
pNode pHead = (pNode)malloc(sizeof(struct node));
pNode pTail = pHead;
pTail->next = NULL;
printf("请输入节点个数:");
scanf("%d",&len);
for(i=;i<len;i++)
{
char *val=(char*)malloc(sizeof(char*));//Warning.malloc
printf("第 %d 个节点的数值:",i+);
scanf("%s",val);
pNode pNew = (pNode)malloc(sizeof(Node));
pNew->data = val;
/*
* 有序的
* 1.将尾节点的next指针指向新节点
* 2.然后把新节点next指针设置为空
* 3. 最后将新节点作为尾节点
*/
pTail->next=pNew;
pNew->next=NULL;
pTail = pNew;
}
printf("create list success!");
return pHead;
} void printList(pNode pHead)
{
pNode p = pHead->next;
while(p!=NULL)
{
printf("%s\n",p->data);
p=p->next;
}
printf("\n");
}
int InsertNode(pNode pHead,int front,char *data)
{
int i = ;
pNode _node = pHead;
pNode pSwap ; if((front<) || (_node==NULL))
{
printf("error:List is NULL or front<1");
return -; }
while(i<front-)
{
_node = _node->next;
++i;
}
pNode pNew = (pNode)malloc(sizeof(Node)); pNew->data=data;
pSwap = _node->next;
_node->next = pNew;
pNew->next = pSwap; return ;
} char* DeleteNode(pNode pHead,int pos)
{
int i=;
char *data;
pNode _node =pHead;
pNode pSwap ;
if((pos < ) && (NULL == _node->next))
{
printf("failed to delete ! \n");
return ;
}
while(i < pos-)
{
_node = _node->next;
++i;
}
pSwap = _node->next;
data = pSwap->data;
_node->next = _node->next->next;
free(pSwap);
return data;
} int LengthList(pNode pHead)
{
int length = ;
pNode temp = pHead->next;
while(temp!=NULL)
{
temp=temp->next;
length++;
}
return length;
} void Sort_List(pNode pHead)
{
int i , j;
char* swap ;
int len=LengthList(pHead);
pNode m,n;
for(i=,m=pHead->next;i<len-;i++,m=m->next)
{
for(j=i+,n=m->next;j<len;j++,n=n->next)
{
if(m->data > n->data)
{
swap = m->data;
m->data = n->data;
n->data = swap;
}
}
}
printf("排序完后结果为:\n");
printList(pHead);
}
pNode Reverse_List(pNode pHead)
{
if(pHead->next==NULL || pHead->next->next ==NULL)
{
return pHead;
}
pNode t=NULL;
pNode p=pHead->next;// first element
pNode q=pHead->next->next;//second element while(q!=NULL)
{
t = q->next;
q->next = p;
p=q;
q=t;
}
pHead->next->next = NULL;
pHead->next = p;
printf("逆序后结果为:\n");
printList(pHead);
return pHead; }