数据结构——单链表
链式存储是最常用的动态存储方法,为了克服顺序表的缺点,可以采用链式方式存储线性表。通常将采用链式存储结构的线性表称为线性链表。
(写的不好希望大家多多指教,欢迎指出错误)
定义
typedef struct Node {//单链表的定义
int data;//数据域
struct Node *next;//指针域
}Node,*LinkList;
对单链表进行初始化
LinkList *InitList(LinkList *L)//初始化单链表
{
*L = (Node *)malloc(sizeof(Node));
(*L)->next = NULL;
return L;
}
这里采用的是尾插法对各个结点进行链接,这样输出的话是按顺序输出,而头插法则是逆序输出
void CreateFromTail(LinkList L)//尾插法建立单链表
{
Node *s, *r;
int i;
r =(Node *) L;
int flag = 1;
while (flag)
{
scanf("%d", &i);
if (i!=-1)
{
s = (Node *)malloc(sizeof(Node));
s->data = i;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
}
只写了一个按序号查找元素,按值查找和这个思路差不多
int GetData(LinkList L, int i)//输入序号查找元素
{
int j,num;
Node *temp;
temp = (Node *)L;
for (j = 0; j < i; j++)
{
if (temp->next == NULL)
printf("是空链表");
temp = temp->next;
}
if (j == i)
num = temp->data;
return num;
}
在单链表中插入一个元素,单链表的插入和删除操作都需要对链表进行遍历
void insertlist(LinkList L, int i, int data)
{
Node *p;
Node *c;
int j;
p = (Node *)L;
for (j = 1; j < i; j++)
{
if (p->next == NULL)
printf("插入位置不合法\n");
p = p->next;
}
if (i == j)
{
c = (Node *)malloc(sizeof(Node));
c->data = data;
c->next = p->next;
p->next = c;
}
}
输入需要删除结点所在的位置
void dellist(LinkList L, int i)//根据位置删除结点
{
int j, num;
Node *temp,*p;
temp = (Node *)L;
for (j = 0; j < i-1; j++)
{
if (temp->next == NULL)
printf("是空链表");
temp = temp->next;
}
p = temp->next;
temp->next = p->next;
}
对两个链表,表A和表B进行合并并排序,同时释放表A和表B
Node *MergeLinkList(LinkList LA, LinkList LB)
{
Node *pa, *pb, *r;
Node *LC = (Node *)malloc(sizeof(Node));
LC->next = NULL;
r = LC;
pa = (Node *)LA;
pb = (Node *)LB;
pa = pa->next;
pb = pb->next;
while (pa != NULL && pb != NULL)
{
if (pa->data <= pb->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
if (pa)
r->next = pa;
if (pb)
r->next = pb;
free(LA);
free(LB);
return LC;
}
打印链表
void print(LinkList L)
{
Node *p;
p = L->next;
printf("单链表中的元素为:");
while (p != NULL)
{
printf("%5d", p->data);
p = p->next;
}
printf("\n");
}
验证
int main()
{
LinkList list,LA,LB;
int i,num,data;
InitList(&list);
printf("请输入数据,输入-1结束:\n");
CreateFromTail(list);
print(list);
printf("请输入需要查找元素的位置:");
scanf("%d", &i);
num = GetData(list, i);
printf("该位置的元素为:%d\n", num);
printf("请输入需要插入的位置和元素:");
scanf("%d%d", &i, &data);
insertlist(list, i, data);
print(list);
printf("请输入需要删除元素的位置:");
scanf("%d", &i);
dellist(list, i);
print(list);
printf("请输入数据,输入-1结束:\n");
InitList(&LA);
CreateFromTail(LA);
print(LA);
printf("请输入数据,输入-1结束:\n");
InitList(&LB);
CreateFromTail(LB);
print(LB);
print(MergeLinkList(LA, LB));
print(LA);
print(LB);
return 0;
}