最近在看数据结构的知识点,自己对数据结构的掌握不是很好,所以就把弱的地方提炼出来,以便以后查看。
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0;
#define OK 1;
typedef struct Node
{
int data;
struct Node *next;
};
struct Node *LinkList;
//初始化单链表
void initList()
{
LinkList = (struct Node *)malloc(sizeof(struct Node *)); //建立头结点
LinkList->next = NULL; //建立空的单链表L
}
//头插法建立单链表
void creatFromHead()
{
struct Node *s;
char c;
int flag=1;
printf("头插法建立单链表,输入字符,输入$结束...\n");
while(flag)
{
c=getchar();
if(c != '$')
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data = c;
s->next = LinkList->next;
LinkList->next = s;
}
else
flag = 0;
}
}
//尾插法建立单链表
void creatFromTail()
{
struct Node *r,*s;
int flag=1;
char c;
printf("尾插法建立单链表,输入字符,输入$结束...\n");
r = LinkList; //r指针指向当前表尾
while(flag)
{
c = getchar();
if(c != '$')
{
s = (struct Node *)malloc(sizeof(struct Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL; //将尾节点的next域置为空,表示链表的结束
}
}
}
//按序号查找
void get(int i)
{
int j;
struct Node *p;
if(i<=0)
{
printf("输入的位置不存在!\n");
}
p=LinkList;
j=0;
while((p->next != NULL)&&(j<i))
{
p=p->next; //扫描下一个节点
j++; //已扫描节点数
}
if(i==j)
printf("查到的值是:%d\n",p->data); //找到了第i个结点
else
printf("没找到!\n");
}
//按值查找
struct Node *Locate(int e_data)
{
struct Node *p;
printf("输入要查找的数据!\n");
p=LinkList->next; //从表中第一个结点开始
while(p != NULL)
{
if(p->data != e_data)
p = p->next;
else
break; //找到结点值是e_data时推出循环
}
return p;
}
//插入操作
int insert(int i,int e_data)
{
struct Node *pre,*s;
int j=0;
printf("输入要插入的数字和位置!\n");
pre=LinkList; //从头开始,查找第i-1个结点
if(i<1)
return ERROR;
while((pre != NULL) && (j<i-1)) //表没有查完,并且没有查到i-1处时,重复
{
pre = pre->next;
j++;
}
if(!pre) //当前位置pre为空,表示已找完还未数到第i个,说明插入位置不合理
{
printf("插入位置不合法\n");
return ERROR;
}
s = (struct Node *)malloc(sizeof(struct Node)); //申请一个新节点s
s->data = e_data;
pre->next = s->next;
pre->next = s;
return OK;
}
// 删除操作
int delList(int i,int *e_data)
{
struct Node *pre,*r;
int k = 0;
printf("输入要删除的数字的位置,以及数字!\n");
pre=LinkList;
while((pre->next !=NULL) && (k<i-1))
{
pre = pre->next;
k++;
}
if(!(pre -> next)) //pre->next为空,说明删除的节点位置i不合法
{
printf("删除位置不合法\n");
return ERROR;
}
r = pre->next;
pre->next = pre->next->next;
*e_data = r->data;
free(r); //释放被删除结点所占的内存空间
return OK;
}
int main()
{
int i=0;
int offset;
struct Node *p;
p = (struct Node *)malloc(sizeof(struct Node));
initList();
creatFromHead();
printf("头插法创建成功!\n");
//按序号查找
printf("输入要查找数据的序号!\n");
scanf("%d",&offset);
get(offset);
return 0;
}