编程c++完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值查找、单链表的插入、删除、

编程c++完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值查找、单链表的插入、删除、遍历访问等基本操作。在此基础上,利用原链表结点空间实现逆转并输出结果。
例如: L->1->3->5->8->9. 逆转后结果为 L->9->8->5->3->1

第1个回答  推荐于2016-02-17
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
// 尾插法
typedef struct node
{
int x;
struct node *front;
struct node *next;
} linklist;

linklist *head = NULL; // 表头
linklist *end = NULL; // 表尾

#define length sizeof(linklist)

void creatlink();
void printendlinklist();
void printheadlinklist();
linklist *searchlink();
void deletelink(linklist * pos);
void insertlink(linklist * pos);
void sortlink();

int main()
{
creatlink();
printheadlinklist();
putchar('\n');
printendlinklist();
return 0;
}

void creatlink()
{
linklist *current, *r;
int y;
current = (linklist *) malloc(length);
current->front = NULL;
printf("Please input nums and end with zero:\n");
scanf("%d", &y);
while (y)
{
current->x = y;
if (head == NULL)
head = current;
else
{
r->next = current;
current->front = r;
}
r = current;
current = (linklist *) malloc(length);
scanf("%d", &y);
}
end = r;
r->next = NULL;
}追答

void printheadlinklist()
{
linklist *p = head;
while (p != NULL)
{
printf("%d ", p->x);
if (p->next != NULL)
p->next->front = p;
if (p->next == NULL)
end = p;
p = p->next;
}
}

void printendlinklist()
{
linklist *p = end;
while (p != NULL)
{
printf("%d ", p->x);
p = p->front;
}

}

linklist *searchlink()
{
linklist *p;
int x;
printf("Please input a num you would search:\n");
scanf("%d", &x);
for (p = head; p != NULL; p = p->next)
{
if (x == p->x)
return p;
}
printf("no record!\n");
exit(0);
}

void deletelink(linklist * pos)
{
if (pos == head)
{
head = head->next;
head->front = NULL;
}
else if (pos == end)
{
end = end->front;
end->next = NULL;
}
else
{
pos->front->next = pos->next;
pos->next->front = pos->front;
}
free(pos);
pos = NULL;
printf("Delete ok!\n");
}

void insertlink(linklist * pos)
{
linklist *newlink;
newlink = (linklist *) malloc(length);
printf("Please input a num of new linknode:\n");
scanf("%d", &newlink->x);
if (pos == end)
{
end->next = newlink;
newlink->next = NULL;
newlink->front = pos;
end = newlink;
}
else
{
newlink->next = pos->next;
newlink->next->front = newlink;
newlink->front = pos;
pos->next = newlink;
}
printf("Insert ok!\n");
}

void sortlink()
{
linklist *endpt;
linklist *p;
linklist *p1, *p2;
p1 = (linklist *) malloc(length);
p1->next = head;
head = p1;

for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->x > p1->next->next->x)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}

p1 = head;
head = head->next;
free(p1);
p1 = NULL;
head->front = NULL;
}

我写的链表中包括查找,删除,排序等基本算法

可以参考下

本回答被提问者和网友采纳
相似回答