c之链表各种操作---初始化,添加、删除、定位、遍历
2014-10-29 21:24
423 查看
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{ //定义节点
int data;
struct Node*next;
}Lnode,*LinkList;
LinkList init_List(int e){ //初始化链表
Lnode *r,*p,*head;
head = (Lnode *)malloc(sizeof(Lnode));//指针类型,head是一个指针
if(head == NULL){
printf("申请空间失败。");
return NULL;
}
int data;
r=head;
for(int i = 0;i < e; i++){ //给链表赋值
scanf("%d",&data);
p=(Lnode *)malloc(sizeof(Lnode));
if(p==NULL){
printf("no memory available\n");
}
else{
p->data= data;
p->next= NULL;
r->next= p;
r= p;
}
}
return head;
}
LinkList Insert(LinkList head,int e){ //添加节点
Lnode *p,*s;
p = head;
int insertdata;
while(p->next->data!= e){
p=p->next;
}
s = (Lnode *)malloc(sizeof(Lnode));
printf("please input the data you want insert:");
scanf("%d",&insertdata);
s->data=insertdata;
s->next=p->next;
p->next=s;
printf("insert succeed\n");
return head;
}
LinkList Delete(LinkList head,int e){ //删除节点
Lnode *p,*s;
p=head;
while(p->next->data==e){
s=p->next;
p->next=s->next;
free(s);
}
printf("delete succeed\n");
return head;
}
int Find(LinkList head,int e){ //节点定位
Lnode *p;
int num=0;
p=head->next;
while(p->data!= e){
num++;
p=p->next;
}
return num;
}
void Travertal(LinkList head){ //遍历整个链表
Lnode *p;
p=head->next;
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList L;
int length;
int insertpos;
int deletedata;
int finddata;
int pos;
printf("please input the length of the link:\n");
scanf("%d",&length);
L = init_List(length);
int choice;
printf("1--Insert\n2--Delete\n3--Find\n4--Output\n");
printf("请输入你的选择:\n");
scanf("%d",&choice);
while(choice!= 0){ //利用while进行循环操作,switch进行选择不同的操作
switch(choice){
case 1://插入
printf("Insert:\n");
printf("please input you pos you want to insert:\n");
scanf("%d",&insertpos);
L=Insert(L,insertpos);
break;
case 2://删除
printf("Delete:\n");
printf("please input the data youwant to delete:\n");
scanf("%d",&deletedata);
Delete(L,deletedata);
break;
case 3://定位
printf("Find\n");
printf("please input the data you want to find:\n");
scanf("%d",&finddata);
printf("the position is:\n");
pos=Find(L,finddata);
printf("%d",pos);
break;
case 4:
printf("Travel:\n");
Travertal(L);
break;
}
scanf("%d",&choice);
}
if(choice==0){
printf("end\n");
}
return 0;
}
错误点:
1.在定义节点时:
typedef struct Node{
int data;
struct Node*next;
}Lnode,*LinkList;
struct Node *next,是定义一个指向节点的指针,所以在*前或者说是在struct之后要有 Node ,才能说明next这个指针是指向节点的
2. s = (Lnode *)malloc(sizeof(Lnode));
在申请空间的时候,s为一个指向节点的指针,所以说申请的空间大小为一个节点的大小,而s是个指针,所以必须强制转化为指向节点的指针类型
模糊点:有待明确
在主函数中定义一个指向节点的指针L,也就是相当于链表头,每次调用的函数中都各自定义一个头节点,函数结束是返回到主函数中,改变主函数中的L,以此传递链表在操作后的结果。
不知道这种方法是不是最简洁易懂的,需要在以后的编写中慢慢摸索。
#include <stdlib.h>
typedef struct Node{ //定义节点
int data;
struct Node*next;
}Lnode,*LinkList;
LinkList init_List(int e){ //初始化链表
Lnode *r,*p,*head;
head = (Lnode *)malloc(sizeof(Lnode));//指针类型,head是一个指针
if(head == NULL){
printf("申请空间失败。");
return NULL;
}
int data;
r=head;
for(int i = 0;i < e; i++){ //给链表赋值
scanf("%d",&data);
p=(Lnode *)malloc(sizeof(Lnode));
if(p==NULL){
printf("no memory available\n");
}
else{
p->data= data;
p->next= NULL;
r->next= p;
r= p;
}
}
return head;
}
LinkList Insert(LinkList head,int e){ //添加节点
Lnode *p,*s;
p = head;
int insertdata;
while(p->next->data!= e){
p=p->next;
}
s = (Lnode *)malloc(sizeof(Lnode));
printf("please input the data you want insert:");
scanf("%d",&insertdata);
s->data=insertdata;
s->next=p->next;
p->next=s;
printf("insert succeed\n");
return head;
}
LinkList Delete(LinkList head,int e){ //删除节点
Lnode *p,*s;
p=head;
while(p->next->data==e){
s=p->next;
p->next=s->next;
free(s);
}
printf("delete succeed\n");
return head;
}
int Find(LinkList head,int e){ //节点定位
Lnode *p;
int num=0;
p=head->next;
while(p->data!= e){
num++;
p=p->next;
}
return num;
}
void Travertal(LinkList head){ //遍历整个链表
Lnode *p;
p=head->next;
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList L;
int length;
int insertpos;
int deletedata;
int finddata;
int pos;
printf("please input the length of the link:\n");
scanf("%d",&length);
L = init_List(length);
int choice;
printf("1--Insert\n2--Delete\n3--Find\n4--Output\n");
printf("请输入你的选择:\n");
scanf("%d",&choice);
while(choice!= 0){ //利用while进行循环操作,switch进行选择不同的操作
switch(choice){
case 1://插入
printf("Insert:\n");
printf("please input you pos you want to insert:\n");
scanf("%d",&insertpos);
L=Insert(L,insertpos);
break;
case 2://删除
printf("Delete:\n");
printf("please input the data youwant to delete:\n");
scanf("%d",&deletedata);
Delete(L,deletedata);
break;
case 3://定位
printf("Find\n");
printf("please input the data you want to find:\n");
scanf("%d",&finddata);
printf("the position is:\n");
pos=Find(L,finddata);
printf("%d",pos);
break;
case 4:
printf("Travel:\n");
Travertal(L);
break;
}
scanf("%d",&choice);
}
if(choice==0){
printf("end\n");
}
return 0;
}
错误点:
1.在定义节点时:
typedef struct Node{
int data;
struct Node*next;
}Lnode,*LinkList;
struct Node *next,是定义一个指向节点的指针,所以在*前或者说是在struct之后要有 Node ,才能说明next这个指针是指向节点的
2. s = (Lnode *)malloc(sizeof(Lnode));
在申请空间的时候,s为一个指向节点的指针,所以说申请的空间大小为一个节点的大小,而s是个指针,所以必须强制转化为指向节点的指针类型
模糊点:有待明确
在主函数中定义一个指向节点的指针L,也就是相当于链表头,每次调用的函数中都各自定义一个头节点,函数结束是返回到主函数中,改变主函数中的L,以此传递链表在操作后的结果。
不知道这种方法是不是最简洁易懂的,需要在以后的编写中慢慢摸索。
相关文章推荐
- c++ 链表操作:添加、遍历、删除、查找
- C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
- c++关于结构体动态链表初始化添加删除操作代码
- C语言链表操作模板(添加,删除,遍历,排序)
- 单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- 单向链表的删除元素,添加元素等操作
- 链式链表的相关操作+删除+添加+逆序+遍历
- 单链表建立,插入,删除,查找,遍历操作
- 单链表的初始化,插入删除等操作
- 双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)
- 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!
- 合并两个排序的链表及简单链表的一些操作(添加节点、删除节点)
- 链表的基础操作总结(链表创建,插入,删除,遍历等等)
- 单向链表--初始化、添加删除节点、排序链表
- C语言各种链表操作(创建、打印、删除、插入、反转)
- 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!
- 《Delphi 算法与数据结构》学习与感悟[8]: 单向链表的添加、删除与遍历
- 一个操作共享内存的类!可以方便的添加,删除数据,包括各种结构体!
- 通过LDAP在AD域控上进行添加、删除、修改、查询等各种操作