链表的基本操作

通过着两个对c,c++,数据结构的复习,感触颇深,正如温故知新。

同时对笔试经常考到的链表操作,通过收集相关的博客,研究了一番,独自实现了一编。在此贴出来作为自己的经验之谈。


结构体申明及定义:
typedef struct Node
{
int data;
struct Node *next;
}LNOde,*LinkList;

/*
1. 结构体指针变量,初始化就是先用struct student *a=(struct student *)malloc(sizeof(struct student));
分配空间,所以它们的指针是不相等的。如果要比较两个结构体的话,通过比较里面的成员是否相等。

2.  先定义一个结构体变量,然后在用两个结构体指针分别指向该结构体,则两个指针指向的地址相等。

3.结构体的比较,最好使用结构体成员比较。判断是否相等时也是用结构体里面的成员挨个比较,如果可以,用c++在结构体里面实现重载函数 operate==();
*/


//链表的基本操作:创建链表 ,打印输出链表,插入,删除,排序
//关键是先定义两个同类型结构的 节点,然后分别从头节点开始赋值,
//一个为当前节点,还有一个作为操作的节点;这样两个节点交替变换,以达到链表的操作要求。


#include <stdio.h>
#include<string.h>


typedef struct Node
{
int data;
struct Node *next;
}LNOde,*LinkList;


void createlist(LinkList L)
{
LinkList p,q;
int n;//节点数
//head = (struct Node*)malloc(sizeof(struct Node));
//q = (struct Node*)malloc(sizeof(struct Node));


//head = L;

//head = (struct Node*)malloc(sizeof(struct Node));
// q = (struct Node*)malloc(sizeof(struct Node));
q = L;
printf("please number of nodes: n=");
scanf("%d",&n);
printf("please n data of node: \n");
while (n--)
{
p = (struct Node*)malloc(sizeof(LNOde));
scanf("%d", &p->data);
p->next = NULL;
   q->next= p;
q = p;
}
}


void print(LinkList L)
{
int num=0;
LinkList p;
p = L->next;
printf("shuchu list is :\n");
while (p != NULL)
{
++num;
printf(" %d  ",p->data);
p = p->next;
}
printf("\n list len is %d\n", num);


}
/*删除链表中的所有元素 a */




void deletenote(LinkList L,int a)
{
LNOde *p, *q;
p = L;
q = p->next;
while (q != NULL)
{
if (q->data == a)
{
p->next = q->next;
free(q);
printf("sahgncui chenggong !\n");
//q = NULL;
}

else
{
p = p->next;
}
q = p->next;

}

}


void daozhi(LinkList L)
{
LNOde* p, *q;
p = L->next;
L->next = NULL;
//q = p->next;
while (p)
{
q = p;
p = p->next;
q->next =L->next;

L->next = q;
}
}


//在链表 L的 i 位置插入元素  e
void listinsert(LinkList L,int i ,int e)
{
LNOde *p, *q;
p = L;
while (i--)
{
p = p->next;
if (p == NULL)
{
printf("插入的位置i 大于 链表 长度len ");
break;
}
}
q = (LinkList)malloc(sizeof(LNOde));
q->data = e;
q->next = p->next;
p->next = q;


}


//排序 这里只是交换了节点里面的数据,如果节点里面还有char ,string型的话,这样做就很复杂了。
//所以此方法是简单的链表用为好
void sort(LinkList L)
{
//冒泡排序  
LNOde* pHead = L;
if (L == NULL)
{
return;
}
if (pHead->next == NULL)
{
return;
}
Node* pi = pHead->next;
Node* pj = pi->next;
for (; pi != NULL; pi = pi->next)
{
for (pj = pi->next; pj != NULL; pj = pj->next)
{
if (pj->data>pi->data)
{
int tmp = pj->data;
pj->data = pi->data;
pi->data = tmp;
}
}
}
}
 


LinkList MergeList(LinkList La, LinkList Lb) //合并有序链表
{
//合并单链表
LinkList Lc;
LinkList pa, pb, pc;
pa = La->next; pb = Lb->next;
Lc = pc = La;
while (pa&&pb)
{
if (pa->data <= pb->data)
{
pc->next = pa; pc = pa; pa = pa->next;
}
else
{
pc->next = pb; pc = pb; pb = pb->next;
}
}
pc->next = pa ? pa : pb;
return Lc;//返回合并后链表的头指针
}


int main()
{
LinkList L;
int a;
int insert;
int e;
L = (struct Node*)malloc(sizeof(struct Node));
createlist(L);
print(L);
printf("shuru delete data: ");
scanf("%d", &a);
deletenote(L, a);
print(L);
//reverse(L);
daozhi(L);
print(L);
printf("插入位置");
scanf("%d",&insert);
printf("插入的数:");
scanf("%d",&e);
listinsert(L, insert, e);
print(L);
sort(L);
print(L);
return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值