您的位置:首页 > 其它

单链表综合操作

2014-02-16 14:06 281 查看
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/*构建结点结构体 */
typedef struct LNode{
int data;
struct LNode * next;
}LNode, * LinkList;
/*用于创建链表的函数 */
/*反序构建的*/
LinkList CreateList_L(LinkList L, int n)
{
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;                      //创建一个空表
for(i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;           // 在头部进行插入,创建的第二个节点讲师末尾的节点
L->next = p;                 //讲L的next的位置给新P的的next,将新p的位置赋值给L的next
}
return L;
}
/* 用于插入结点的函数 */

LinkList ListInsert_L(LinkList L, int i, int newnode)//参数 长度,位置,数值
{
LinkList p = L;
LinkList s;
int j = 0;
while(p&&j<i-1)                             //将指针位置移到需要创建位置的前面
{
p = p->next;
++j;
}
if(!p||j>i-1)                               //指针应该不等于或1>i,指针不等于0代表没有大于表长。
{
printf("位置小于1或大于表长。\n");
return L;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = newnode;
s->next = p->next;                          //将s的next指向原来p的next,再将p的next指向s
p->next = s;
return L;

}

/* 用于删除结点的函数 */

LinkList ListDelete_L(LinkList L, int i)
{
LinkList p = L;
LinkList s;
int j=0;
while(p->next&&j<i-1)
{
p = p->next;
++j;
}
if(!(p->next)||j>i-1)
{
printf("删除位置不合理。\n");
return L;
}
s = p->next;
p->next = s->next;            //p->next=p->next->next
printf("%s%d\n","被删除的结点是:",s->data);
free(s);
return L;
}

/*用于遍历链表的函数 */
void ListDisp_L(LinkList L)
{
LinkList p;
int i=0;
p = L->next;

while(p)
{
printf("%d:%d\n", ++i,p->data);
p = p->next;   //依次输出将p后移
}

}

/* 选择排序算法  */

LinkList ListSort_L(LinkList L)
{
LinkList h1,p,q,r,s;
h1=p=(LinkList)malloc(sizeof(LinkList));
p->next=L;
while(p->next)
{
q=p->next;
r=p;
while(q->next)
{
if(q->next->data < r->next->data)
r=q;
q=q->next;
}
if(r!=p)
{
s=r->next;
r->next=s->next;
s->next=p->next;
p->next=s;
}
p=p->next;
}
L=h1->next;
free(h1);
return L;
}

int getoptions()
{
int opt;
printf("               ***************************************************  \n");
printf("               *******************by    ruoyun********************  \n");
printf("               ***************************************************  \n");
printf("               ********        1: 录入链表             ***********  \n");
printf("               ********        2: 显示链表             ***********  \n");
printf("               ********        3: 插入结点             ***********  \n");
printf("               ********        4: 删除结点             ***********  \n");
printf("               ********        5: 排序链表             ***********  \n");
printf("               ********        6: 退出                 ***********  \n");
printf("               ********        输入选项并按回车确认:   ***********  \n");
printf("               ***************************************************  \n");
scanf("%d",&opt);
return opt;
}

int main(int argc, char* argv[])
{
int opt;
int where;
int value;
int count;
LinkList L;
while(1)
{
system("CLS");
opt = getoptions();
switch(opt)
{

case  1:
{
system("CLS");
printf("请输入链表初始结点数:");
scanf("%d",&count);
printf("请输入各个结点数值,每输入一个按回车确认:\n");
L = CreateList_L(L, count);
system("CLS");
ListDisp_L(L);
system("PAUSE");
break;
}
case  2:
{
system("CLS");
ListDisp_L(L);
system("PAUSE");
break;
}
case  3:
{
system("CLS");
ListDisp_L(L);
printf("请输入插入位置:");
scanf("%d", &where);
printf("请输入要插入的数值:");
scanf("%d", &value);
system("CLS");
L = ListInsert_L(L,where,value);
ListDisp_L(L);
system("PAUSE");
break;
}
case  4:
{
system("CLS");
ListDisp_L(L);
printf("请输入要删除的位置:");
scanf("%d",&where);
system("CLS");
L = ListDelete_L(L,where);
ListDisp_L(L);
system("PAUSE");
break;
}
case  5:
{
system("CLS");
L = ListSort_L(L);
ListDisp_L(L);
system("PAUSE");
break;
}
case  6:
{
return 0;
}
default :
{
printf("您输入有误,请从新输入 \n");
system("PAUSE");
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: