#include <iostream>
using namespace std;
typedef struct node
{
int data;
struct node *next;
} LNode, *LinkList;
void CreateList_L(LinkList &L, int n) //*2.4用表头插入法逆序建立带头结点的单链表
{
L = (LinkList) malloc(sizeof(LNode)); //未做溢出判定,应加入
L->next = NULL; //建立头结点,假定与元素结点结构相同
for(int i=n; i>0; --i) //从后向前输入元素
{
LinkList p = (LinkList)malloc(sizeof(LNode));//生成新结点
scanf("%d",&p->data); //从键盘输入元素值,存入新结点中
p->next = L->next;
L->next = p; //新结点插入到表头
}
}
LinkList CreatListR1(void)//*2.5用尾插法建立带头节点的单链表
{
char ch;
LinkList head = (LinkList)malloc(sizeof(LNode));//生成头结点
LinkList s,r;//工作指针
r = head;//尾指针也指向头结点
while((ch=getchar()!='\n'))
{
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data = ch;//将读入的数据放入新结点的数据域中
r->next = s;
r=s;
}
r->next = NULL;//尾结点的指针域置空
return head;
}
int GetElem_L(LinkList L, int i, int &e)//*2.1查找第i个元素
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return 0;
e=p->data;
return 1;
}
LinkList CreateList_LT( )//*2.6表尾插入法建立不带头结点的单链表
{
char ch;
LinkList head;
LNode *p, *r ; //p 指向新申请的结点,r 指向链表的尾结点
head = NULL;
r = NULL;
while((ch = getchar() != '\n'))
{
p = (LinkList)malloc(sizeof(LNode));
p->data = ch;
if(head == NULL)//插入第一个结点
head = p;
else
r->next = p; //插入第二个及以后的结点
r = p;
}
if (r != NULL)
r->next = NULL;
return head;
}
int ListInsert_L(LinkList &L, int i, int e)//*2.2在带头结点的单链线性表L中第i个位置之前插人元素e
{
LinkList p=L;
int j = 0;
while(p && j<i-1)
{
p = p->next;
++j;
}//寻找第i-1个结点
if (p == NULL || j > i-1)
return 0;//i小于1或者大于表长加1
LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;
s->next = p->next;//插人L中
p->next =s;
return 1;
}// ListInsert L
int ListDelete_L(LinkList &L, int i, int &e)//*2.3在带头结点的单链线性长L中,删除第i个心素,并山e返回其值
{
LinkList p = L, q;
int j=0;
while(p->next && j<i-1) //寻找第i个结点﹐并令p指向其前趋
{
p = p->next;
j++;
}
if ((p->next==NULL) || j>i-1)
return 0;//删除位置不合理
q = p->next ;
p->next = q->next;//删除并释放结点
e = q->data;
free(q);
return 1;
}//ListDelete_L
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)//*2.7已知单链线性表La和Lb的元素按值非递减排列。
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
{
LinkList pa = La->next;
LinkList pb = Lb->next, pc;
Lc = pc = La; //用La的头结点作为Lc的头结点
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;//插人剩余段
free(Lb);//释放Lb的头结点
}//MergeList-L
int main()
{
LinkList p,H,tail;
int arr[10]= {1,2,3,4,5,6,7,8,9,10};
int n=5;
int x;
H = (LinkList)malloc(sizeof(LNode));
H->next = NULL;
tail = H;
for(int i=0; i<n; i++)
{
p=(struct node*)malloc(sizeof(LNode));
p->data = arr[i];
p->next = NULL;
tail->next = p;
tail = p;
}
p=H->next;
//GetElem_L(H, 3, x);//查找
//ListInsert_L(H, 3, 10);//插入
//ListDelete_L(H, 3, x);
LinkList HH,HC;
HH = (LinkList)malloc(sizeof(LNode));
HH->next = NULL;
tail = HH;
for(int i=0; i<2*n; i+=2)
{
p=(struct node*)malloc(sizeof(LNode));
p->data = arr[i];
p->next = NULL;
tail->next = p;
tail = p;
}
MergeList_L(H,HH,HC);
p=HC->next;
while(p->next!=NULL)
{
printf("%d ", p->data);
p=p->next;
}
printf("%d\n", p->data);
//printf("%d\n", x);
return 0;
}
2.1数据结构书上可运行代码--线性表的链式表示和实现
猜你喜欢
转载自blog.csdn.net/weixin_42137874/article/details/107685771
今日推荐
周排行