您的位置:首页 > 编程语言 > C语言/C++

[置顶] 线性表的链式存储结构(C语言实现)

2017-10-29 23:11 423 查看
由于线性表的顺序存储结构在进行插入与删除是要移动大量的元素,会耗费大量的时间,线性表的链式存储结构就完美的解决了这个问题。

首先是单链表的创建,有头插法和尾插法。

头插法:

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0));                         /* 初始化随机数种子 */
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;                      /*  先建立一个带头结点的单链表 */
for (i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); /*  生成新结点 */
p->data = rand()%100+1;             /*  随机生成100以内的数字 */
p->next = (*L)->next;
(*L)->next = p;                     /*  插入到表头 */
}
}


2.尾插法:

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time(0));                      /* 初始化随机数种子 */
*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
r=*L;                                /* r为指向尾部的结点 */
for (i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */
p->data = rand()%100+1;           /*  随机生成100以内的数字 */
r->next=p;                        /* 将表尾终端结点的指针指向新结点 */
r = p;                            /* 将当前的新结点定义为表尾终端结点 */
}
r->next = NULL;                       /* 表示当前链表结束 */
}


完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
typedef struct Node *LinkList;

/*头插法创建单链表*/
void CreateListHead(LinkList *L, int n){
LinkList p;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i = 0; i < n; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}
/*尾插法创建单链表*/
void CreateListTail(LinkList *L, int n){
LinkList p, r;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
r = *L;//r为指向尾部的结点
for (i = 0; i < n; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
r->next = p;
r = p;      //将p结点赋值给r,使r始终是尾结点
}
r->next = NULL;
}

/*单链表的插入*/
void ListInsert(LinkList *L, int i, int e){
LinkList p,s;
p = *L;
int j=1;
while (p&&j<i)   //寻找第i-1个结点
{
p = p->next;
j++;
}
if (!p&&j>i)exit(0);//第i个结点不存在
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
}
/*单链表的删除*/
void ListDelete(LinkList *L, int i){
LinkList p, q;
p = *L;
int j = 1;
while (p->next&&j<i)  //寻找第i-1个结点
{
p = p->next;
j++;
}
if (!(p->next) && j>i) exit(0);
q = p->next;
p->next = q->next;
free(q);
}
void visit(int c){
printf("%d ", c);
}
void ListPrint(LinkList L){
LinkList p = L->next;
while (p)
{
visit(p->data);
p = p->next;
}
printf("\n");
}
int main(){
LinkList m, n;
int k = 6;
CreateListHead(&m,k);
ListPrint(m);
CreateListTail(&n, k);
ListPrint(n);
ListInsert(&m, 5, 11);
ListDelete(&n, 3);
ListPrint(m);
ListPrint(n);
system("pause");
return 0;
}


单链表的插入与删除的关键都是要先找到要操作位置的前一个结点,而插入与删除不同,对于找到第i-1个结点,插入是while (p&&j
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: